如何使用 luxon 解析 UNIX 时间戳?

WoJ*_*WoJ 14 javascript date momentjs luxon

我尝试使用该luxon库来摆脱moment- 将时间戳转换1615065599.426264为 ISO 日期。

根据在线纪元转换器,这对应于

GMT: 2021 年 3 月 6 日星期六 9:19:59.426 PM
您的时区: 2021 年 3 月 6 日星期六 10:19:59.426 PM GMT+01:00
相对时间: 3 天前

删除小数部分会得到相同的结果。

代码使用luxon

let timestamp = 1615065599.426264
console.log(luxon.DateTime.fromMillis(Math.trunc(timestamp)).toISO())
console.log(luxon.DateTime.fromMillis(timestamp).toISO())
Run Code Online (Sandbox Code Playgroud)
<script src="https://moment.github.io/luxon/global/luxon.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

这个结果是

1970-01-19T17:37:45.599+01:00
1970-01-19T17:37:45.599+01:00
Run Code Online (Sandbox Code Playgroud)

它可疑地接近Unix Epoch (1970-01-01 00:00:00)。

我的错误在哪里?

Sen*_*les 20

Luxon 可以使用 .fromSeconds() 函数接受以秒为单位的 UNIX/纪元时间。然后,您可以使用 .toISO() 函数输出 ISO 格式。

在你的具体例子中:

const { DateTime } = require('luxon')

//your other code here 

const myDateTime = DateTime.fromSeconds(1615065599.426264)
const myDateTimeISO = myDateTime.toISO()

//outputs '2021-03-07T08:19:59.426+11:00'
Run Code Online (Sandbox Code Playgroud)

参考: https: //moment.github.io/luxon/#/parsing? id=unix-timestamps


m90*_*m90 9

所谓的“Unix 时间”计算自 1970 年 1 月 1 日以来的秒数而 Luxon(以及 JavaScript 的大多数事物)期望一个具有毫秒分辨率的值。

将您的值乘以 1000 将得出预期结果:

> let timestamp = 1615065599.426264
undefined
> new Date(timestamp).toJSON()
'1970-01-19T16:37:45.599Z'
> new Date(timestamp * 1000).toJSON()
'2021-03-06T21:19:59.426Z'
Run Code Online (Sandbox Code Playgroud)


Vad*_*est 5

为了给出更完整的答案,确实有两种存储时间戳的方法:秒和毫秒精度。

JavaScript 确实默认使用 ms 精度。

Luxon 提供了 2 种不同的方法:

  • DateTime.fromMillis(1691760353000)
  • DateTime.fromSeconds(1691760353)

调用时两者都会产生相同的输出date.toISO()

  • 2023-08-11T13:25:53.000+00:00

根据您使用的精度,您需要使用其中之一。

我写这个答案是因为另一个答案并没有说得很清楚,而且我发现自己toSeconds在我真正想要的时候使用了toMillis.