我正在尝试在用户的特定时区创建一个UTC基准日期,在这种情况下" America / Los Angeles"使用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 AM,我期待1448904600000,这是太平洋海岸时间的11/30/15 9:30 AM。如何在用户的时区将此开始日期翻译到正确的时间?
答案 0 :(得分:5)
是的,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
这给了你所要求的价值,但对我而言 - 这是一种气味,表明期望有些不对劲。我看起来更接近要求和系统的其他部分。
答案 1 :(得分:1)
moment#valueOf
只输出自Unix Epoch
值得注意的是,尽管上面的显示有所不同,但它们都是同一时刻。
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();
来查看差异