Вы можете использовать функции в Data.Time.Format для чтения дат.Ниже я включил тривиальную программу, которая считывает дату в одном формате и записывает эту дату обратно в двух разных форматах.Чтобы прочитать однозначные месяцы или дни, поместите один дефис (-) между% и спецификатором формата.Другими словами, для разбора дат, отформатированных как 9-9-2012, нужно включить один дефис между символами% и формата.Таким образом, для разбора "9-9-2012" вам понадобится строка формата "% -d -% - m-% Y".
Примечание: этот ответ становится немного длинным в зубахучитывая скорость, с которой развиваются пакеты Haskell.Возможно, пришло время искать лучшее решение.Я больше не пишу на Haskell, так что было бы неплохо, если бы кто-то создал другой ответ, так как этот вопрос занимает важное место в результатах поиска Google.
По состоянию на июль 2017 года в приведенном ниже коде используется теперьустарел parseTime.Вам рекомендуется использовать parseTimeOrError сейчас.Код становится следующим:
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
Версии из файла .cabal: build-зависимость: base> = 4.9 && <4.10, время> = 1.6.0.1
По состоянию наАвгуст 2014 года , языковой стандарт был лучше всего получен из пакета «System.Locale», а не из пакета «Locale» Haskell 1998 года.Имея это в виду, приведенный выше пример кода выглядит так:
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
вывод теперь выглядит следующим образом:
"2012/01/26 10:54"
"01/26/2012 10:54 AM"
"2012/08/09 10:54"
** Оригинал, январь 2012 г. ** ответ:
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
Вывод выглядит следующим образом:
"2012/01/26 10:54"
"01/26/2012 10:54 AM"
Data.Time.Format доступен из пакета "time".Если вам необходимо проанализировать месячные или дни, состоящие из одной цифры, другими словами, даты, такие как 9-9-2012, включите один дефис между символами% и формата.Таким образом, для разбора «9-9-2012» вам понадобится строка формата «% -d -% - m-% Y».