Puede usar las funciones en Data.Time.Format para leer las fechas. He incluido un programa trivial a continuación que se lee en una fecha en un formato y escribe esa fecha en dos formatos diferentes. Para leer en meses o días de un solo dígito, coloque un solo guión (-) entre el% y el especificador de formato.
import Locale
import Data.Time
import Data.Time.Format
main =
do
let dateString = "26 Jan 2012 10:54 AM"
let timeFromString = readTime defaultTimeLocale "%d %b %Y %l:%M %p" dateString :: UTCTime
-- Format YYYY/MM/DD HH:MM
print $ formatTime defaultTimeLocale "%Y/%m/%d %H:%M" timeFromString
-- Format MM/DD/YYYY hh:MM AM/PM
print $ formatTime defaultTimeLocale "%m/%d/%Y %I:%M %p" timeFromString
La salida tiene el siguiente aspecto:
"2012/01/26 10:54"
"01/26/2012 10:54 AM"
Data.Time.Format está disponible en el paquete de "tiempo". Si necesita analizar meses o días de un solo dígito, en otras palabras, fechas como 9-9-2012, incluya un único guión entre el% y los caracteres de formato. Por lo tanto, para analizar "9-9-2012", necesitaría la cadena de formato "% -d -% - m-% Y".
A partir de agosto de 2014, la configuración regional ahora se obtiene mejor del paquete "System.Locale" en lugar del paquete "Locale" de Haskell 1998.Con esto en mente, el código de ejemplo desde arriba ahora lee:
import System.Locale
import Data.Time
import Data.Time.Format
main =
do
let dateString = "26 Jan 2012 10:54 AM"
let timeFromString = readTime defaultTimeLocale "%d %b %Y %l:%M %p" dateString :: UTCTime
-- Format YYYY/MM/DD HH:MM
print $ formatTime defaultTimeLocale "%Y/%m/%d %H:%M" timeFromString
-- Format MM/DD/YYYY hh:MM AM/PM
print $ formatTime defaultTimeLocale "%m/%d/%Y %I:%M %p" timeFromString
-- now for a string with single digit months and days:
let dateString = "9-8-2012 10:54 AM"
let timeFromString = readTime defaultTimeLocale "%-d-%-m-%Y %l:%M %p" dateString :: UTCTime
-- Format YYYY/MM/DD HH:MM
print $ formatTime defaultTimeLocale "%Y/%m/%d %H:%M" timeFromString
de salida ahora se ve así:
"2012/01/26 10:54"
"01/26/2012 10:54 AM"
"2012/08/09 10:54"
partir de julio de 2017, el código anterior utiliza el parseTime ahora en desuso. Se le anima a usar parseTimeOrError ahora. El código se convierte en:
import Data.Time
main =
do
let dateString = "26 Jan 2012 10:54 AM"
let timeFromString = parseTimeOrError True defaultTimeLocale "%d %b %Y %l:%M %p" dateString :: UTCTime
-- Format YYYY/MM/DD HH:MM
print $ formatTime defaultTimeLocale "%Y/%m/%d %H:%M" timeFromString
-- Format MM/DD/YYYY hh:MM AM/PM
print $ formatTime defaultTimeLocale "%m/%d/%Y %I:%M %p" timeFromString
-- now for a string with single digit months and days:
let dateString = "9-8-2012 10:54 AM"
let timeFromString = parseTimeOrError True defaultTimeLocale "%-d-%-m-%Y %l:%M %p" dateString :: UTCTime
-- Format YYYY/MM/DD HH:MM
print $ formatTime defaultTimeLocale "%Y/%m/%d %H:%M" timeFromString
Las versiones del archivo: .cabal acumulación depende: base de> = 4,9 & & < 4.10, hora> = 1.6.0.1
Dicho esto, esta respuesta es cada vez un poco largo en el diente dado el ritmo al que evolucionan los paquetes de Haskell. Puede ser hora de buscar una mejor solución.
¿no necesita guiones entre% m,% d, y% Y de todos modos? – sclv
@AlexBaranosky es posible que desee considerar aceptar una respuesta diferente a esta pregunta :) – Ben