>我在mongodb中存储了本地时间,例如"2016-04-25T09:30:00.000Z"它被保存为"UTC"(末尾为 Z),但实际上它是本地时间的文字表示。我还存储了时区,例如"欧洲/伦敦",所以我有我需要转换为正确 UTC 时间的所有信息。
在该原因中,结果应该是"2016-04-25T08:30:00.000Z",但我找不到如何做到这一点的方法。我尝试了时刻时区。
有一种比您那里的方法更容易,更不容易出错的方法。只需使用忽略末尾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,所以第二个可能不是你想要的。
我相信问题在于为时刻库指定000Z
区域的格式。它说它已经是UTC 0,在这种情况下,时区='欧洲/伦敦'被忽略。
moment.utc(moment(start).tz(timezone)).format()
使用日期格式 "2016-04-25T09:30:00"
正常工作。在此处查看可运行版本
找到了!
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)));