如何从Haskell中的字符串解析UTCTime类型的时间值?

mnt*_*123 2 time parsing haskell

这是不久前问的一个后续问题。

我无法找到一个简单的例子(对不起我的谷歌技能)在哈斯克尔现场展示了如何使用该Data.Time功能来转换格式StringUTCTime,然后能够从加/减分/秒和转换回UTCTime至格式String

我要寻找一个例子,说明如何转换String(例如像"10:20:30"UTCTime,然后加1000秒,那个时候,怎么办使用此哈斯克尔Data.Time库,而完全不使用IO?

函数的类型应为FormatTime -> String -> UTCTime

该函数应使用TimeLocaleFormatTime需要区域设置/格式。

库中有太多的函数,而且类型太多,以至于令人困惑。readTimeTimeLocaleParseTime tNominalDiffTimeTime,什么不是。

请不要仅指向Haskell网站文档。大多数文档都只是源代码中的类型签名转储,几乎没有任何示例。抱歉,这很糟糕,但是我花了很多时间试图从那些文档中找出一些东西。

将此与Python文档进行比较。这么多美丽的例子。谢天谢地,有。

tom*_*ahh 6

import Data.Time

timeFormat = "%H:%M:%S"
understandTime = parseTimeOrError True defaultTimeLocale timeFormat

time :: UTCTime
time = understandTime "10:30:20"
Run Code Online (Sandbox Code Playgroud)
?> time
1970-01-01 10:30:20 UTC
Run Code Online (Sandbox Code Playgroud)

让我们分解一下正在发生的事情:

  • timeFormat 只是一个字符串,描述了我们期望时间如何传递给我们。
  • 我们部分地将应用于parseTimeOrErrordefaultTimeLocale用于语言环境,并且先前timeFormat针对预期格式进行了定义。
  • 现在understandTime,我们有了一个函数,该函数可能需要一段时间才能完成String。使用它时,我们需要将期望的输出类型显式设置为UTCTime(这是正确的time :: UTCTime)。如果我们要understandTime在已经期望a的函数的上下文中使用UTCTime,那将是不必要的(例如addUTCTime 1000 (understandTime "10:30:20")
  • 我们回来了time。请注意,年,日,月和时区默认为1970-01-01和UTC,因为我们没有在中显式读取它们timeFormat