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

2024-05-02

我正在尝试根据用户特定时区的 UTC 基准​​创建日期,在本例中使用 momentjs/momentjs 时区的“美国/洛杉矶”。但是,我没有得到我期望的结果:

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:30,我期待的是 1448904600000,即太平洋海岸时间 11/30/15 上午 9:30。如何将此开始日期转换为用户时区的正确时间?


Yes, 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 调试窗口的屏幕截图,包含您的确切代码:

另外,您在评论中写道:

//moment("2015-11-30"); //monday 11/30 in 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

这给出了你所要求的值,但对我来说 - 这是一种与期望有问题的气味。我会更仔细地研究需求和系统的其他部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Momentjs 时区 - 获取特定时区时间的日期 的相关文章

随机推荐