【问题标题】:Incorrect timezone adjustment in moment.js and spacetimemoment.js 和时空中的时区调整不正确
【发布时间】:2018-11-19 19:28:50
【问题描述】:

我的服务器正在向我的 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。为什么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 解决方法,但我更喜欢使用本机方法,所以我很好奇为什么这不起作用。有什么想法吗?

【问题讨论】:

    标签: javascript datetime timezone momentjs


    【解决方案1】:
    • 山地标准时间为 UTC-7
    • 山地夏令时间为 UTC-6
    • 目前是 11 月 19 日,夏令时没有生效,所以您目前获得的是 UTC-7
    • 对于您给出的日期,2018-08-24T17:00:00,DST 有效,所以您得到 UTC-6

    一切正常。

    换句话说,它当前是否生效并不重要,重要的是它是否/曾经/将在相关日期生效。


    关于这部分:

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

    不要那样做。您不是在调整时区,而是在选择不同的时间。

    【讨论】:

    • 您能解释一下如何判断 2018-08-24T17:00:00 是夏令时吗?该时间戳中没有时区信息。
    • 我现在看到了问题。感谢您的意见!
    • 仅从时间戳,你无法分辨。但是,您说您在山区时区(卡尔加里,来自您的个人资料)。请参阅this page。您可以看到卡尔加里的 8 月是 MDT (UTC-6)。不一定在任何地方都有夏令时 - 但它适合您,在那个日期和时间。
    猜你喜欢
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    相关资源
    最近更新 更多