【问题标题】:moment.tz is giving incorrect resultmoment.tz 给出的结果不正确
【发布时间】:2017-12-14 00:52:05
【问题描述】:

我试图根据所选时区转换日期。我很惊讶地看到时差为 5 分钟的日期的结果相同。 例如,

var x = "2017-07-10T18:30:00.000Z"
var y = "2017-07-10T18:35:00.000Z"
var z = "2017-07-10T18:45:00.000Z"

并尝试将它们转换为使用 moment.tz:

moment.tz(x, 'America/New_York').format('DD/MM/YYYY HH:MM:SS');
moment.tz(y, 'America/New_York').format('DD/MM/YYYY HH:MM:SS')
moment.tz(z, 'America/New_York').format('DD/MM/YYYY HH:MM:SS')

令我惊讶的是,"10/07/2017 14:07:00" 的所有 3 个结果都相同。 怎么了?任何帮助将不胜感激。

【问题讨论】:

    标签: timezone momentjs


    【解决方案1】:

    简答:

    问题是您在format() 中使用大写MM(月)而不是小写mm 分钟。请注意,SS(小数秒)和ss(秒)存在同样的问题。


    关于您的代码示例的一般说明:

    使用moment.tz 来解析使用给定时区的时间字符串(例如'America/New_York'),moment.tz 不适用于将输入转换为给定时区。

    您必须使用tz() 方法将时刻对象转换为给定时区。

    请注意,您的输入字符串以 Z 结尾,因此它表示 UTC 时间。


    正如马特约翰逊在 cmets 中指出的那样,在您的情况下,即使是 moment.tz(input, zone) 也会将输入转换为给定的区域,因为输入字符串包含 Z(保留为 UTC 时区)。无论如何,不​​鼓励这种方法。


    这里是parses UTC时间字符串并将其转换为'America/New_York'时区的代码示例:

    var x = "2017-07-10T18:30:00.000Z";
    var y = "2017-07-10T18:35:00.000Z";
    var z = "2017-07-10T18:45:00.000Z";
    
    console.log( moment.utc(x).tz('America/New_York').format('DD/MM/YYYY HH:MM:SS') );
    console.log( moment.utc(y).tz( 'America/New_York').format('DD/MM/YYYY HH:mm:ss') );
    console.log( moment.utc(z).tz( 'America/New_York').format('DD/MM/YYYY HH:mm:ss') );
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.13/moment-timezone-with-data-2012-2022.min.js"></script>

    【讨论】:

    • 如何从 console.log 的输出返回 x?有逆向机制吗?
    • 实际上,因为输入包含Z,所以它确实会被视为UTC并仅使用moment.tz(input, zone)进行转换。不过,它的形式有点糟糕,因为只是放弃 Z 会改变行为,所以我仍然会采用你的方法。 :)
    • @MattJohnson 感谢您的评论,我已经编辑了我的答案以包含该信息。感谢您分享这个 momentjs 行为(我认为这是完全合理的,但有点令人惊讶并且没有很好的记录)。我从这种贡献中学到了很多:)
    • @PrashantPrabhakarSingh _ 从 console.log_ 的输出返回 x 是什么意思?我建议更好地解释它,可能最好的办法是发布另一个具有此新要求的问题。
    猜你喜欢
    • 2012-08-27
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2011-11-30
    相关资源
    最近更新 更多