使用Moment.js从ISO字符串中提取utcOffset

K_C*_*K_C 4 javascript momentjs

使用moment.js,我试图从ISO日期字符串中提取偏移量,以便稍后在格式化纪元时间戳时使用偏移量,以确保时间戳的转换位于同一时区.

即使字符串中的偏移量为-0400,结果始终为0;

var currentTime = "2015-03-18T16:10:00.001-0400";
var utcOffset = moment(currentTime).utcOffset(); // 0
Run Code Online (Sandbox Code Playgroud)

我试图使用parseZone()也没有成功.有没有办法从字符串中提取-0400所以我可以在格式化另一个时间时使用它?

谢谢您的帮助!KC

Mat*_*int 13

提取偏移量的正确方法确实如此 parseZone

var currentTime = "2015-03-18T16:10:00.001-0400";
var utcOffset = moment.parseZone(currentTime).utcOffset();
Run Code Online (Sandbox Code Playgroud)

这应该导致-240,这意味着落后于UTC 240分钟,这-0400与输入字符串中的相同.如果你想要字符串形式,而不是utcOffset()你可以使用.format('Z')for "-04:00".format('ZZ')for "-0400".

您在问题中提供的表单只使用计算机的本地时区.所以它在你的时区(或代码运行的任何地方)目前是UTC + 00:00,这可以解释为什么你会得到零.您必须使用parseZone保留输入字符串的偏移量.

此外 - 您的用例有点令人担忧.请记住,偏移时区不同.时区可以在不同的时间点改变其偏移.许多时区都是为了适应夏令时.如果从一个时间戳中选择偏移量并将其应用于另一个时间戳,则无法保证偏移量对于新时间戳是正确的.

例如,考虑美国东部时区,当夏令时于2015年3月8日生效时,该时区刚刚从UTC-05:00变为UTC-04:00.如果您选择的值与您提供的值相同,并且将它应用到3月1日,您将把它放入大西洋时区而不是东部时区.