Momentjs时区-获取特定时区时间的日期

7

我正在尝试使用momentjs/momentjs timezone从UTC基础上创建一个用户特定时区的日期,这里是"America/Los Angeles"。然而,我得到的结果与我的期望不符:

var tempDate = moment(1448841600000); //moment("2015-11-30"); //monday 11/30 in UTC
var adjustedStart = moment.tz(tempDate, "America/Los_Angeles");
adjustedStart.hour(9);
adjustedStart.minute(30);
console.log("adjustedStart in milliseconds:" + adjustedStart.valueOf());

控制台输出为1448875800000,即UTC/GMT时区下的11/30/15 9:30AM,我期望的是1448904600000,即太平洋海岸时间下的11/30/15 9:30AM。如何将此开始日期转换为用户所在时区的正确时间?

2个回答

10

是的,1448841600000 是你说的日期:

moment(1448841600000).utc().format()
// "2015-11-30T00:00:00+00:00"

但是在太平洋时间,那将会早一天。

moment(1448841600000).tz('America/Los_Angeles').format()
// "2015-11-29T16:00:00-08:00"

当你将时间调整为太平洋时区的9:30时,日期是29日而不是30日。

moment(1448841600000).tz('America/Los_Angeles').hour(9).minute(30).format()
// "2015-11-29T09:30:00-08:00"

当你调用valueOf时,结果为:

moment(1448841600000).tz('America/Los_Angeles').hour(9).minute(30).valueOf()
// 1448818200000

这是正确的值,但与您提供的不同。然而,当我运行您的代码时,我也得到了这个值。

Chrome 调试窗口中显示的屏幕截图,显示了您的精确代码:

screenshot

此外,在您编写的注释中:

//moment("2015-11-30"); //monday 11/30 in UTC

实际上,那将是以当地时间为准,而不是协调世界时(UTC)。如果您想要使用UTC,您可以使用:

实际上,那将是以当地时间为准,而不是协调世界时(UTC)。如果您想要使用UTC,您可以使用:

moment.utc("2015-11-30")

虽然我不确定您是使用字符串输入还是数值时间戳。

如果您的问题是想让UTC日期被视为本地日期,并应用任意本地时间,那么这是一种有些奇怪的操作,但它会像这样进行:

var tempDate = moment.utc(1448841600000);
var adjustedStart = moment.tz([tempDate.year(), tempDate.month(), tempDate.date(), 9, 30],
                                                                  "America/Los_Angeles");
console.log("adjustedStart in milliseconds:" + adjustedStart.valueOf());
// adjustedStart in milliseconds:1448904600000

这样可以得到你所要求的值,但对我来说,这意味着期望中可能存在问题。我会更仔细地检查需求和系统的其他部分。


这确实是一种有点奇怪的操作,但你最后回答的正是我所寻找的。 - Eric H

2

来自 http://momentjs.com/docs/:

moment#valueOf 简单地输出自 Unix 纪元以来的毫秒数。

需要注意的是,尽管上面的显示不同,它们都代表同一时刻。

var a = moment();
var b = moment.utc();
a.format();  // 2013-02-04T10:35:24-08:00
b.format();  // 2013-02-04T18:35:24+00:00
a.valueOf(); // 1360002924000
b.valueOf(); // 1360002924000

所以它不应该因为不同的时区而有所不同。

你应该使用adjustedStart.format();来查看差异。


是的,显示内容会根据所显示的语言环境而改变。在这里,我想要以特定时区为起点的纪元时间,实际上我请求的是不同的时间点,而不是将原始时间转换为该语言环境。 - Eric H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接