Javascript 如何设置瞬间js对象的Unix纪元?

Javascript 如何设置瞬间js对象的Unix纪元?,javascript,momentjs,Javascript,Momentjs,我有一个moment.js对象,我想更改它的Unix历元值 通常我会使用myMoment=moment(someEpoch),但由于设计限制,我必须通过引用传递对象,因此我必须改变值,而不是完全替换它 在v2.15+中,最整洁(理想)和最高效的方法是什么?moment.js有一种方法可以做到这一点: moment.unix(数字) 假设m是一个力矩对象,而t是要设置的时间戳(以毫秒为单位),最简单的方法可能是: m.add(t-m); 或者,如果您希望更详细一些: m.add(t - m.va

我有一个moment.js对象,我想更改它的Unix历元值

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


在v2.15+中,最整洁(理想)和最高效的方法是什么?

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

moment.unix(数字)


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

m.add(t-m);
或者,如果您希望更详细一些:

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

然而,如果您真的在最小化内部执行的总操作方面追求最高效的代码,那么您可以直接修改内部操作这样做是危险的,因为不能保证内部不会在不同版本之间更改。只有遵循SemVer规则的公共API兼容性才能得到保证。因此,只有在您正在优化性能并愿意处理未来可能出现的突破性变化时,才可以这样做:

m._d.setTime(t + ((m._offset || 0) * 60000));
这本质上是对矩函数的一个反转,如果它内置于矩中,那么实现可能就是这样的

当然,如果您仅在UTC模式下处理瞬间,您可以执行以下操作:

m._d.setTime(t);

最后一件事,关于术语,您不能实际设置“Unix历元值”,因为历元是一个固定值。在此上下文中,“历元”是指与
1970-01-01T00:00:00.000Z
相关联的零时间戳。这是无法改变的。您只需使用“Unix时间戳(以毫秒为单位)”或“基于历元的时间戳”。但是,将变量命名为
someEpoch

是一种用词不当的做法。这不会改变现有实例。我决定采用第一种解决方案。修改内部构件将是非常危险的——特别是对我来说,因为我的应用程序在部署时重新收集其NPM依赖项,它可能会悄悄地获取新的次要库版本,然后导致运行时异常。我最终能够记住这个特定过程的结果,因此代码不再是热门路径。尽管如此,还是要感谢您。另外,请注意,moment的未来版本(v3.0.0)将使用。