Haskell:将UTCTime转换为秒和毫秒

时间:2012-11-20 22:01:09

标签: datetime haskell

换句话说,我正在寻找相当于Python的datetime.utcnow()

对于包含数年,数月等的n元组,​​我也很好,直到毫秒(或微秒)。

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

2 个答案:

答案 0 :(得分:4)

重新解析一个字符串非常非Haskellish,你当然不希望这样。

我使用来自Data.Time.LocalTime

todSec . localTimeOfDay . utcToLocalTime utc

以皮秒分辨率为秒。

答案 1 :(得分:0)

从什么时候开始的秒和毫秒?据推测,这里有一个隐藏在某处的时代(零时间)。从UTCTime中减去epoch以获得NominalDiffTime,然后从中提取秒和毫秒。

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

当然你可能想要t0为1/1/1970(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中返回一个结果。