问题描述
我正在尝试将 Date.Date
从 justinmimbs/date
包转换为 Time.Posix
从 elm/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