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 纪元转换的主要内容,如果未能解决你的问题,请参考以下文章
使用 Moment.js 获取当前的 unixtimestamp