我有当地时间存储在mongodb中,例如" 2016-04-25T09:30:00.000Z" 它被保存为' UTC' (Z在结尾)但实际上它是当地时间的字面表示。我还存储了时区,例如"欧洲/伦敦"所以我需要转换为正确的时间所需的所有信息。
因为原因应该是" 2016-04-25T08:30:00.000Z"但我找不到如何做的方法。我试过了时间 - 时区。
答案 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)));