如何使用moment-tz.js解析tz" GMT-08:00"

时间:2018-04-29 15:49:08

标签: javascript time momentjs

我尝试运行这个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"。无论如何我可以调整它吗?

2 个答案:

答案 0 :(得分:0)

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

  

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>

请注意:

  • 时刻formatting令牌区分大小写,因此您必须使用YYYY多年,D表示该月的某一天(d是星期几)< / LI>
  • 15245784000002018-04-24 14:00:00 UTC,我遗漏了为什么您希望5am作为输出。

答案 1 :(得分:0)

我正在研究类似的主题,并得到了您原始问题的答案。如果对您来说太晚了,希望将对其他人有所帮助。

首先,就像@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');

返回值为:“ 2018年4月2日6:00:00 -08:00” 请注意,您期望的是凌晨5点,但这是夏令时,因此返回的是凌晨6点。