如何在Haskell中将UTCTime格式化为ISO 8601?

14

你要从哪种数据类型或格式转换时间? - jwodder
任何常用的时间类型,例如UTCTimeZonedTime - nh2
2个回答

17

我没有看到任何预设函数可以做到这一点,但是你可以轻松地使用 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" 就可以了(在 the aeson source code 中找到)。 - nh2
2
请注意,我的前面的评论仍然没有插入尾随零。我现在还发布了一个名为iso8601-time的软件包,可以处理此问题。 - nh2
1
将MongoDB中的IsoDate转换为UTCTime,真是救了我的一天:parseTimestamp = parseTimeOrError False defaultTimeLocale "%FT%T%QZ" - Mikkel
谢谢!这也救了我的命。我可能会向Data.Persist提交一个pull request。真是疯狂,花了我几个小时来处理一个简单的日期输入。 - Chad Brewbaker
五年后,事实证明这并不完全正确。请查看我创建的软件包中的此问题;还请参见aeson中出现错误的情况。%F将999年格式化为“999”,而不是ISO 8601所需的“0999”。 - nh2
2022年,我遇到了“无法加载模块'System.Locale'”的错误,但是在我的cabal文件中添加了“old-locale-1.0.0.7”后,问题得到了解决。 - beyarkay

5

在版本1.9中,time库添加了此功能(docs):

iso8601Show :: ISO8601 t => t -> String

UTCTime有一个ISO8601实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接