如何设置片刻js对象的Unix纪元?

时间:2016-09-26 12:00:47

标签: javascript momentjs

我有一个我想改变它的Unix纪元价值的moment.js对象。

通常我会使用myMoment = moment(someEpoch);,但由于设计限制,我不得不通过引用传递对象,所以我必须改变值而不是完全替换它。

在v2.15 +中执行此操作的最佳和(最理想)最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

假设m是一个时刻对象,t是要设置的时间戳(以毫秒为单位),可能最简单的方法是:

m.add(t-m);

或者如果你想更加冗长:

m.add(t - m.valueOf(), 'ms');

请注意,未指定时默认单位为毫秒,输入为数字。如果您的输入时间戳是整秒,则在减去m的值之前,您必须在上述任一公式中将其乘以1000。

但是,如果您在最小化内部执行的总操作方面确实在效率最高的代码之后,则可以直接修改内部时间。 这样做很危险,因为不能保证内部版本在版本之间不会发生变化。遵循SemVer规则,只保证公共API兼容性。因此,只有在优化性能并且愿意处理未来可能发生的重大变化时才会这样做:

m._d.setTime(t + ((m._offset || 0) * 60000));

这实际上是对时刻valueOf函数的反转,并且可能是实现在内置时的实现方式。

当然,如果您只处理UTC模式中的时刻,您可以这样做:

m._d.setTime(t);

最后一点,关于术语,你实际上不能设置" Unix纪元价值",因为纪元是固定的值。在这种背景下," epoch"表示与1970-01-01T00:00:00.000Z关联的时间戳为零。它无法改变。您只是使用" Unix时间戳(以毫秒为单位),或者可能是基于纪元的时间戳"。但是,将变量命名为someEpoch是错误的。

答案 1 :(得分:0)

moment.js有一个方法可以做到这一点:

moment.unix(Number)

http://momentjs.com/docs/#/parsing/unix-timestamp/