如何在Haskell中将日期/时间格式化为ISO 8601

nh2*_*nh2 14 datetime haskell iso8601

我想将完整的日期/时间转换为像ISO 一样的new Date().toISOString() ISO 8601格式,给出一种YYYY-MM-DDTHH:mm:ss.sssZ格式.

我找不到基本库函数或包来执行此操作.

jwo*_*der 16

我没有看到任何预先存在的功能,但你可以轻松使用Data.Time.Format.formatTime:

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

iso8601 :: UTCTime -> String
iso8601 = formatTime defaultTimeLocale "%FT%T%QZ"
Run Code Online (Sandbox Code Playgroud)

(您需要将时间转换为UTCTime传递给此函数之前的时间,以便它实际显示实际的UTC时间.)

  • 很好的答案.它似乎比我要求的更多位数 - 所以让我们把它们切掉:`iso8601 t = take 23(formatTime defaultTimeLocale"%FT%T%Q"t)++"Z"`会做虽然(见[aeson源代码](http://hackage.haskell.org/package/aeson-0.6.1.0/docs/src/Data-Aeson-Types-Class.html#FromJSON)]. (2认同)
  • 请注意,之前的评论仍然不会插入尾随零.我现在还在Hackage上发布了一个包[iso8601-time](http://hackage.haskell.org/package/iso8601-time)来处理它. (2认同)

nh2*_*nh2 5

time版本中的库添加1.9了此功能(文档):

iso8601Show :: ISO8601 t => t -> String

UTCTime有一个ISO8601实例。

ghci> import Data.Time
ghci> import Data.Time.Format.ISO8601
ghci> iso8601Show <$> getCurrentTime
"2023-11-18T14:58:56.371121983Z"
Run Code Online (Sandbox Code Playgroud)