Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Datetime 如何从UTCTime获取秒和毫秒分量?_Datetime_Haskell - Fatal编程技术网

Datetime 如何从UTCTime获取秒和毫秒分量?

Datetime 如何从UTCTime获取秒和毫秒分量?,datetime,haskell,Datetime,Haskell,换句话说,我正在寻找Python的等价物 我也可以使用包含年、月等的n元组,直到毫秒(或微秒) 我曾想过使用show,然后解析字符串值,但我相信还有更方便的方法。重新解析字符串非常不方便,你肯定不希望这样 我会用,从 这给了你秒的皮秒分辨率。从什么时候开始的秒和毫秒?大概有一个纪元(时间零点)藏在这里的某个地方。从UTCTime中减去历元得到一个NominalDiffTime,然后从中提取秒和毫秒 secondsSince :: UTCTime -> UTCTime -> (Inte

换句话说,我正在寻找Python的等价物

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


我曾想过使用
show
,然后解析
字符串
值,但我相信还有更方便的方法。

重新解析字符串非常不方便,你肯定不希望这样

我会用,从


这给了你秒的皮秒分辨率。

从什么时候开始的秒和毫秒?大概有一个纪元(时间零点)藏在这里的某个地方。从UTCTime中减去历元得到一个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时代),在这种情况下,您将导入并使用utcTimeToPOSIXSeconds,它返回一个NominalDiffTime

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

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


正确的做法应该是将time\u t设置为一个结构,将日数和午夜后的秒数作为单独的字段,并让时间算术函数查阅闰秒表。然而,这也有它自己的缺点,因为新的闰秒经常被指定,所以一个程序在不同的时间运行时会给出不同的结果。或者用Haskell的话来说,“diffUTCTime”必须在IO monad中返回一个结果。

相关:这是相当误导的,因为它只给出当前日期的秒数部分(即0到60之间的数字),而不是以秒为单位的当前时间。这通常不是人们说的“将时间转换为毫秒”的意思。
secondsSince :: UTCTime -> UTCTime -> (Integer, Int)
secondsSince t0 t1 = (i, round $ d * 1000)
   where (i, d) = properFraction $ diffUTCTime t1 t0