moment-timezone setDefault行为异常

时间:2019-05-12 10:46:40

标签: momentjs moment-timezone

使用以下代码:

console.log(moment().toJSON());
moment.tz.setDefault("Europe/Brussels");
console.log(moment().toJSON());

我得到以下结果:

2019-05-12T10:39:12.851Z
2019-05-12T10:39:12.863Z

但是,当我阅读moment-timezone的文档时,setDefault应该将我的默认时区设置为“欧洲/布鲁塞尔”,因此输出应为:

2019-05-12T10:39:12.851Z
2019-05-12T11:39:12.863Z

显然,setDefault不能满足我的需求(它正在生成新日期,就像我在指定时区一样),那么这样做的最佳选择是什么?

2 个答案:

答案 0 :(得分:2)

setDefault可以正常工作,问题在于您显示时刻实例值的方式。 toJSON()显示UTC时间(另请参见toISOString() .toISOString()返回UTC时间戳):

  

将对象序列化为JSON时,如果存在Moment对象,则该对象将表示为ISO8601字符串,已调整为UTC。

     

相反,如果您希望使用ISO8601字符串来反映当前时刻的utcOffset(),则可以像这样修改toJSON函数:

moment.fn.toJSON = function() { return this.format(); }

因此,您可以使用format()代替,这里是一个实时示例:

console.log(moment().toJSON());
console.log(moment().format());
moment.tz.setDefault("Europe/Brussels");
console.log(moment().toJSON());
console.log(moment().format());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data-2012-2022.min.js"></script>

答案 1 :(得分:0)

这可能是由于加载了没有时区数据的moment-timezone引起的。

尝试加载moment-timezone-with-data-10-year-range.js而不是moment-timezone.js(如果这就是您要加载的内容)。

文档中有关于which build to use的更多信息。