如何将存储为UTC的本地时间转换为实际正确的UTC值

时间:2016-04-27 09:21:30

标签: node.js timezone momentjs

我有当地时间存储在mongodb中,例如" 2016-04-25T09:30:00.000Z" 它被保存为' UTC' (Z在结尾)但实际上它是当地时间的字面表示。我还存储了时区,例如"欧洲/伦敦"所以我需要转换为正确的时间所需的所有信息。

因为原因应该是" 2016-04-25T08:30:00.000Z"但我找不到如何做的方法。我试过了时间 - 时区。

3 个答案:

答案 0 :(得分:2)

有一个比你那里更容易,更容易出错的方式。只需使用忽略最后Z的格式解析日期:

moment.tz("2016-04-25T09:30:00.000Z", 'YYYY-MM-DDTHH:mm:ss:SSS', 'Europe/London').format()
"2016-04-25T09:30:00+01:00"

日期已正确解析,获取UTC日期就像调用.toISOString()

一样简单
moment.tz("2016-04-25T09:30:00.000Z", 'YYYY-MM-DDTHH:mm:ss:SSS', 'Europe/London').toISOString()
"2016-04-25T08:30:00.000Z"

请注意,如果这是一个本地日期,无论时区如何,您都可以省略时区标识符,只使用浏览器的本地时间:

moment("2016-04-25T09:30:00.000Z", 'YYYY-MM-DDTHH:mm:ss:SSS').format()
"2016-04-25T09:30:00-05:00"

但我认为你正在使用Node,因此第二个可能不是你想要的。

答案 1 :(得分:1)

我确实认为问题是指定时刻为000Z区域的格式。它表示它已经是UTC 0,而在这种情况下,时区='欧洲/伦敦'将被忽略。

moment.utc(moment(start).tz(timezone)).format()

正在使用日期格式"2016-04-25T09:30:00"。 查看可运行的版本here

答案 2 :(得分:0)

发现它!

var start = "2016-04-25T09:30:00.000Z";
var timezone = 'Europe/London';
var mZoned = moment.tz(start, timezone);
var mStart = moment.utc(start);
var correctedStart = moment.utc(1000*(mStart.unix() - (mZoned.utcOffset()*60)));