【问题标题】:How to use moment-tz.js to parse tz like "GMT-08:00"如何使用 moment-tz.js 解析 tz,如“GMT-08:00”
【发布时间】:2018-04-29 15:49:07
【问题描述】:

我尝试运行这个js

return function(milliSeconds, timeZoneId) {
    if (milliSeconds == 0) {
        return "";
    }
    var now = moment();

    return now.tz(timeZoneIdm, milliSeconds).format('MMM d, yyyy H:mm:ss'); 
}

例如这个输入:

milliSeconds = "1524578400000"

timezoneId = "GMT-08:00"

解析 "GMT-08:00" 失败。无论如何我可以调整它来工作吗?

【问题讨论】:

    标签: javascript time momentjs


    【解决方案1】:

    正如moment.tz(..., String) docs 所述:

    moment.tz 构造函数采用与moment 构造函数相同的所有参数,但将最后一个参数用作time zone identifier

    时区标识符类似于'America/New_York''Europe/Rome'"GMT-08:00" 不是有效输入。

    在您的情况下,您可以使用 moment(Number) 然后:

    var milliSeconds = "1524578400000";
    var timezoneId = "GMT-08:00";
    
    var timeInt = parseInt(milliSeconds, 10)
    var m1 = moment(timeInt).tz('America/Los_Angeles');
    console.log(m1.format('MMM D, YYYY H:mm:ss'));
    
    var offset = timezoneId.substring(3);
    var m2 = moment(timeInt).utcOffset(offset);
    console.log(m2.format('MMM D, YYYY H:mm:ss'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.14/moment-timezone-with-data-2012-2022.min.js"></script>

    请注意:

    • moment formatting 标记区分大小写,因此您必须使用 YYYY 表示年份,使用 D 表示月份中的某天(d 是星期几)
    • 15245784000002018-04-24 14:00:00 UTC,我不知道为什么您期望 5am 作为输出。

    【讨论】:

    • 我实际上不得不更改签名,因为moment.tz(..., String) 引发了运行时异常。似乎第一个 arg 应该是 tz
    【解决方案2】:

    我正在研究类似的主题,并得到了您最初问题的答案。如果这对您来说太晚了,希望会帮助其他人。

    首先,就像@VincenzoC 解释的那样: 1. 必须将 Moment.JS 的 Unix 时间戳更改为 10 位。 2. 年份的格式应该是“YYYY”而不是“yyyy”。

    根据这里的解释enter link description here POSIX 兼容性要求反转偏移量。因此,Etc/GMT-X 的偏移量为 +X,Etc/GMT+X 的偏移量为 -X。这是 IANA 时区数据库的结果,而不是 Moment.js 的任意选择。

    您需要将设置更改为: var timezoneId = "Etc/GMT+08"; 然后运行 moment.unix(1524578400).tz("Etc/GMT+8").format('MMM d, YYYY H:mm:ss Z');

    返回为:“Apr 2, 2018 6:00:00 -08:00” 请注意,您期望的时间是早上 5 点,但这是夏令时,所以返回时间是早上 6 点,这是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多