moment.js和时空中的时区调整不正确

时间:2018-11-19 19:28:50

标签: javascript datetime timezone momentjs

我的服务器正在向我的Javascript客户端发送UTC时间戳。我目前在山区时间,目前处于夏令时(GMT-7),但是我所做的任何时区调整都仅应用-6偏移。

要确认javascript甚至知道我的时区,我执行了以下操作:

console.log(Date().toString());,它输出以下内容:Mon Nov 19 2018 12:13:28 GMT-0700 (Mountain Standard Time)。很明显,JS知道我目前在GMT-7。

现在,我的服务器正在发送2018-08-24T17:00:00。因此,我使用moment.js进行了解析,将其转换为本地时区,然后格式化结果。

moment.utc(this.props.value).local().format('h:mm A')

结果值为11:00 AM。 17:00:00-7偏移为10:00,即10:00 AM。为什么将javascript转换为11:00?如果尝试使用spacetime库,我会得到相同的结果:

   const s = spacetime(this.props.value,'UTC')
    s.goto(spacetime().timezone().name);
    console.log(s.format('h:mm a')); // Also spits out 11:00 AM

如果我手动调整具有偏移量的矩对象,它将正常工作:

var m = moment.utc(this.props.value);
m.add(-(new Date()).getTimezoneOffset(), 'minutes');
console.log(m.format('h:mm A')) // Outputs the correct time: 10:00 AM

当Javascript清楚知道我所处的时区时,为什么momentspacetime都不能正确调整我的时区? Chrome和Microsoft Edge都发生相同的问题。现在,我将使用上面的hacky解决方法,但是我更喜欢使用本机方法,因此我很好奇为什么这不起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

  • 山标准时间是UTC-7
  • 山夏令时为UTC-6
  • 目前是11月19日,DST尚未生效,因此您目前使用的是UTC-7
  • 对于您给的日期2018-08-24T17:00:00,DST 有效,因此您获得UTC-6

一切正常。

换句话说,当前是否有效并不重要,仅在有关日期是否有效。


关于这部分:

m.add(-(new Date()).getTimezoneOffset(), 'minutes');

不要那样做。您没有调整时区,而是选择了其他时间。