Javascript moment.tz问题,设置了“a”;Etc/GMT[&x2B;|-]HH:MM";时区

Javascript moment.tz问题,设置了“a”;Etc/GMT[&x2B;|-]HH:MM";时区,javascript,timezone,momentjs,Javascript,Timezone,Momentjs,我花了一天多的时间研究这个问题,深入研究了源代码,这似乎是很棒的javascript moment.tz库的一个问题: 每当我传入“Etc/GMTtime value”的时区标识符时,返回的moment.tz对象返回我认为是格式(“Z”)值的值,因为它乘以-1 例如: var pacificTime = moment.tz("2016-09-29 21:00:00","America/Los_Angeles"); pacificTime.format("YYYY-MM-DD HH:mm:ss Z

我花了一天多的时间研究这个问题,深入研究了源代码,这似乎是很棒的javascript moment.tz库的一个问题:

每当我传入“Etc/GMTtime value”的时区标识符时,返回的moment.tz对象返回我认为是格式(“Z”)值的值,因为它乘以-1

例如:

var pacificTime = moment.tz("2016-09-29 21:00:00","America/Los_Angeles");
pacificTime.format("YYYY-MM-DD HH:mm:ss Z z");
输出:“2016-09-29 21:00:00-07:00 PDT”

这一切都是意料之中的

现在,使用相同的时区(GMT-7):

输出:“2016-09-29 21:00:00+07:00GMT-7”

粗体值始终是我认为应该的负值:传入“Etc/GMT+5”返回“-5:00”值

这让我很头疼,因为我正在使用的网页上有日期/时间记录,记录的是一个整数“GMT offset”值,我只需将其转换为“Etc/GMT”+offset_值,并传递到矩.tz中进行时区转换。然后,我需要对值进行进一步的操作(添加天数、显示“Z”格式的值等),但这个问题阻碍了进一步的工作


这是moment.tz解析“Etc/GMT”时区值的一个缺陷,还是我遗漏了一些关于时区格式的基本信息?

IANA数据库中的标识符,如
Etc/GMT-7
故意将其偏移量反转。这是这种类型的标识符设计的一部分。看,还有。(基本上,它源于在某些环境中需要向后兼容较旧的POSIX标准。)

但是,对于Moment.js,如果使用固定的时区偏移,则根本不需要使用这些。事实上,你根本不需要现在时区的扩展

// the parseZone method will retain the offset provided
var a = moment.parseZone("2016-09-29 21:00:00 -07:00");

// or, you can set the offset explicitly like this:
var b = moment.utc("2016-09-29 21:00:00").utcOffset("-07:00", true);

// or like this if you prefer:
var c = moment.utc("2016-09-29 21:00:00").utcOffset(-7, true);
对于
b
c
,请注意
true
参数需要保留给定的本地时间。还请注意,我使用
moment.utc(…)
最初解析字符串。它也只适用于
时刻(…)
,但是本地时区中的DST转换可能会干扰临时值


此外,确保您认识到
America/Los_Angeles
根据DST是否生效而在-8和-7之间交替。这就是为什么您需要时刻时区来提供何时在偏移之间切换的规则。

我做了进一步的测试,它似乎是moment.tz中的一个格式错误;我运行了以下测试:
GMT\u减去7.utc().format(“YYYY-MM-DD HH:MM:ss Z”)
并得到了响应“2016-09-29 14:00:00+00:00 utc”。utc转换正确地从21:00减去7小时,得到14:00。因此,对于这个用例,“Z”值的格式可能不正确。请写出您的注释-您调用了
.utc()
,因此之后的任何内容都将使用utc,即
+00:00
。太棒了!非常感谢你!
// the parseZone method will retain the offset provided
var a = moment.parseZone("2016-09-29 21:00:00 -07:00");

// or, you can set the offset explicitly like this:
var b = moment.utc("2016-09-29 21:00:00").utcOffset("-07:00", true);

// or like this if you prefer:
var c = moment.utc("2016-09-29 21:00:00").utcOffset(-7, true);