2013-10-26 9 views
14

Я хотел был бы преобразовать полную дату/время в ISO 8601 формат like JavaScript's new Date().toISOString() делает, давая YYYY-MM-DDTHH:mm:ss.sssZ формат.Как отформатировать дату/время как ISO 8601 в Haskell

Я не могу найти базовую библиотечную функцию или пакет для этого.

+0

Какой тип данных или формат вы конвертируете время * из *? – jwodder

+0

Любой из обычно используемых, например. 'UTCTime' или' ZonedTime'. – nh2

ответ

16

Я не вижу уже существующие функции для этого, но вы можете сделать один легко с помощью Data.Time.Format.formatTime:

import System.Locale (defaultTimeLocale) 
import Data.Time.Format (formatTime) 

iso8601 :: UTCTime -> String 
iso8601 = formatTime defaultTimeLocale "%FT%T%QZ" 

(Вы должны преобразовать время в UTCTime перед передачей этой функции для фактического отображения фактического времени UTC.)

+2

Хороший ответ. Кажется, что за точкой стоит несколько цифр, чем я просил, поэтому давайте отключим их: 'iso8601 t = take 23 (formatTime defaultTimeLocale"% FT% T% Q "t) ++" Z "' будет делать хотя (найдено в [исходном коде эзона] (http://hackage.haskell.org/package/aeson-0.6.1.0/docs/src/Data-Aeson-Types-Class.html#FromJSON). – nh2

+2

Обратите внимание, что мой комментарий перед тем, как все еще не вставлять конечные нули. Я также выпустил пакет [iso8601-time] (http://hackage.haskell.org/package/iso8601-time) в Hackage прямо сейчас, что с ним связано. – nh2

+0

Красиво сделано @ nh2! Это отличный подход. –

Смежные вопросы