Moment.js 和 Unix 纪元转换

Posted

技术标签:

【中文标题】Moment.js 和 Unix 纪元转换【英文标题】:Moment.js and Unix Epoch Conversion 【发布时间】:2013-08-04 01:22:11 【问题描述】:

我有一个 Web 服务,它返回如下字符串的日期:

/Date(1377907200000)/

我使用 MomentJS 将其解析为 moment 对象。

moment("/Date(1377907200000)/") => Fri Aug 30 2013 20:00:00 GMT-0400

这一切都很好。但是当我在对象上调用unix() 时,我得到的值是1377907200。然而,这对应于Fri Jan 16 1970 17:45:07 GMT-0500。我可以乘以 unix() 返回的值,但这对我来说似乎很草率。我怀疑我通过调用unix() 所做的并不是我想的那样。调用unix() 时是否需要指定某种格式?我在这里错过了什么?

JSFidle showing the conversion to moment and then back.

【问题讨论】:

你不需要这样转换为日期对象,moment可以处理moment(1377907200000)就好了。很好奇为什么网络服务会返回这样的日期。 我们使用返回它的网络服务——这是因为 API 的目标消费者通常是 javascript,它“以毫秒为单位”而不是秒。它针对最有可能的消费者。 【参考方案1】:

meagar 提供的答案是正确的,从严格的 JavaScript / Unix 时间角度来看。但是,如果您只乘以 1000,您将失去数据中可能存在的任何亚秒级精度。

Moment.js 提供了两种不同的方法,如 in the docs 所述。 .unix() 以秒为单位返回值。它实际上是除以 1000 并截断任何小数。你想使用.valueOf() 方法,它只返回毫秒而不做修改。

【讨论】:

感谢您提供更多详细信息。至少对于这个不需要的项目,因为粒度只有一天。 哦,实际上,我看到这完全符合我的预期。我宁愿不以任何方式修改该值,因此您的答案实际上是理想的。 抱歉,.valueOf() 会调用什么对象? @chovy - 这是任何moment 对象上的方法,例如moment().valueOf() @MattJohnson 感谢您的洞察力!一直在敲我的头关于这个问题! :-)【参考方案2】:

在 JavaScript 领域,当您将 Date 转换为整数时,您会得到自 unix 纪元以来的 milli 秒数。传统的 Unix 时间是自纪元以来的数。乘以 1000 是正确的选择。

【讨论】:

这是有道理的。谢谢你的解释。 或者只是moment("/Date(1377907200000)/").toDate().getTime()【参考方案3】:

此解决方案帮助我使用 moment.js 将格式添加到 Epoch 日期。

moment(1377907200000).format("DD MMM YYYY hh:mm A")

【讨论】:

以上是关于Moment.js 和 Unix 纪元转换的主要内容,如果未能解决你的问题,请参考以下文章

Unix时间戳的moment.js格式?

Moment.js 基本用法

使用 Moment.js 获取当前的 unixtimestamp

将 UNIX 纪元转换为日期对象

如何将自纪元以来的 Unix 时间/时间转换为标准日期和时间?

将小时和分钟字符串转换为纪元(unix 时间戳)