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

时间:2016-10-02 14:52:12

标签: parsing haskell time

这是不久前the one I asked的后续问题。

我在Haskell网站上找不到一个例子(抱歉我的Google技能),该网站展示了如何使用Data.Time函数将格式化的String转换为UTCTime和然后可以从中添加/减去分钟/秒,并将UTCTime转换回格式化的String

我正在寻找一个示例,展示如何转换String(例如像"10:20:30"UTCTime然后再添加1000秒。如何使用Haskell Data.Time库根本不使用IO?

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

该函数应使用TimeLocaleFormatTime作为区域设置/格式设置。

库中有如此多的功能,它们只是令人困惑的类型。 readTimeTimeLocaleParseTime tNominalDiffTimeTime等等。

请不要只指向the Haskell site上的文档。大多数文档只是源代码中的类型签名转储,几乎没有任何示例。很抱歉,如果这是咆哮,但我花了很多时间试图从这些文档中找出一些东西。

按时与Python docs进行比较。这么多漂亮的例子。 感谢上帝,有SO。

1 个答案:

答案 0 :(得分:5)

import Data.Time

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

time :: UTCTime
time = understandTime "10:30:20"
λ> time
1970-01-01 10:30:20 UTC

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

  • timeFormat只是一个字符串,描述了我们如何期望将时间传递给我们。
  • 我们部分应用parseTimeOrError,使用defaultTimeLocale作为语言环境,之前已定义timeFormat作为预期格式。
  • 我们现在有一个understandTime函数,可以将String作为时间。使用它时,我们需要将预期的输出类型显式设置为UTCTime(这是time :: UTCTime的作用)。如果我们在已经期望understandTime的函数的上下文中使用UTCTime,则这是不必要的(例如addUTCTime 1000 (understandTime "10:30:20")
  • 我们回来time。请注意,年,日,月和时区默认为1970-01-01和UTC,因为我们未在timeFormat中明确阅读它们。