4

换句话说,我正在寻找 Python 的datetime.utcnow()等价物。

我也可以使用包含年、月等的 n 元组,直到毫秒(或微秒)。

我曾想过使用show然后解析该String值,但我相信还有更方便的东西。

4

2 回答 2

4

重新解析一个字符串是非常不友好的,你当然不希望那样。

我会使用,从Data.Time.LocalTime

todSec . localTimeOfDay . utcToLocalTime utc  ::  UTCTime -> Data.Fixed.Pico

以皮秒分辨率为您提供几秒钟的时间。

于 2012-11-20T22:13:55.173 回答
3

从什么时候开始的秒和毫秒?大概有一个纪元(时间为零)隐藏在这里的某个地方。您从 UTCTime 中减去纪元以获得 NominalDiffTime,然后从中提取秒和毫秒。

secondsSince :: UTCTime -> UTCTime -> (Integer, Int)
secondsSince t0 t1 = (i, round $ d * 1000)
   where (i, d) = properFraction $ diffUTCTime t1 t0

当然,您可能希望 t0 为 1970 年 1 月 1 日(Unix 纪元),在这种情况下,您导入Data.Time.Clock.POSIX并使用 utcTimeToPOSIXSeconds,它返回一个 NominalDiffTime。

NominalDiffTime 是(除其他外)Fractional 和 Num 的一个实例,因此您可以在操作它们时访问所有常用的数字运算符。从算术的角度来看(包括转换),它被视为秒数。

使用它时,请记住 Unix 会从根本上错误地获取时间,因为它没有任何闰秒空间。每隔几年就有一天是 86401 秒,而不是通常的 86400。早在 70 年代,计算机需要知道这一点的想法似乎是荒谬的(时钟通常由系统管理员参考他的机械表来设置),所以Unix time_t 只计算纪元以来的秒数,并假设每天正好有 86400 秒。NominalDiffTime 是“名义上的”,因为它做出了相同的假设。

正确的做法是使 time_t 成为一个结构,其中包含天数和自午夜以来的秒数作为单独的字段,并让时间算术函数查阅闰秒表。然而,这将有其自身的一系列缺点,因为新的闰秒会经常被指定,因此程序在不同时间运行时可能会给出不同的结果。或者用 Haskell 术语来说,“diffUTCTime”必须在 IO monad 中返回结果。

于 2013-08-16T16:32:00.080 回答