相对于unix时间

问题描述

我正在尝试将 Date.Datejustinmimbs/date 包转换为 Time.Posixelm/time 或自 UNIX 时代以来的整数毫秒。

我目前的方法如下,但似乎无法正常工作。

datetoPosixTime : Date.Date -> Time.Posix
datetoPosixTime date =
    Time.millisToPosix (Date.toRataDie date - 719162 * (1000 * 60 * 60 * 24))

(719162 是 1970 年 1 月 1 日到 0001 年 1 月 1 日的偏移量)

这似乎有效,但它不再给我工作结果

另一种方法

datetoPosixTime : Date.Date -> Time.Posix
datetoPosixTime date =
    Time.millisToPosix ((Date.toRataDie date - epochStartOffset) * (1001 * 60 * 60 * 24) - (1000 * 60 * 60 * 24))

解决方法

好的,基本上我描述的第二种方法有效,如果你不小心写了 1001 * 60 * 60 * 24 而不是正确的 1000 * 60 * 60 * 24,因为一秒只有 1000 毫秒,而不是 1001。

因此工作代码是:

epochStartOffset : Int
epochStartOffset =
    719162


dateToPosixTime : Date.Date -> Time.Posix
dateToPosixTime date =
    Time.millisToPosix ((Date.toRataDie date - epochStartOffset) * (1000 * 60 * 60 * 24) - (1000 * 60 * 60 * 24))
,

如果您希望明确与合作的日期(UTC?纽约?尼泊尔?),justinmimbs/time-extra 有一个方便的 partsToPosix function,使它成为使用签名 Zone -> Date -> Posix

轻松创建一个明确的函数
midnightOfDate : Zone -> Date -> Posix
midnightOfDate zone date =
    TE.partsToPosix zone
        { year = Date.year date,month = Date.month date,day = Date.day date,hour = 0,minute = 0,second = 0,millisecond = 0
        }

关于榆树repl:

> Date.fromRataDie 719163 |> Date.toIsoString
"1970-01-01" : String

> midnightOfDate Time.utc (Date.fromRataDie 719163)
Posix 0 : Time.Posix