我有UTC日期变量:
let d = '/Date(1538560800000+0200)/';我试着把它转换到我的当地时间,但没有成功:
moment(accessGroup.TimeOn).toDate() // result: Wed Oct 03 2018 12:00:00 GMT+0200 (Central European Summer Time)
moment(d).local().format("DD-MM-YYYY hh-mm-ss"); // result: "03-10-2018 12-00-00"
moment.utc(d).local().format("DD-MM-YYYY hh-mm-ss"); // result: "03-10-2018 12-00-00"我想要当地时间14:00。怎样才是正确的方法呢?
发布于 2018-10-05 18:34:35
在创建字符串时,我们首先检查字符串是否与已知的ISO 8601格式相匹配,然后检查该字符串是否与RFC 2822日期时间格式相匹配,如果没有找到已知格式,则将其放到新日期( string )的回退位置。
矩可接受字符串参数的ISO 8601和RFC 2822格式,您的输入/Date(1538560800000+0200)/也不是。不过,当您将其传递给moment时,它会尝试将其转换为字符串,并最终提取可能的时间戳参数,即1538560800000。在下面的代码中可以看到这一点,因为两者最终都是相同的值。
let d = '/Date(1538560800000+0200)/'
moment(d).toString() // Wed Oct 03 2018 12:00:00 GMT+0200
moment(1538560800000).toString() // Wed Oct 03 2018 12:00:00 GMT+02001538560800000转换为格林尼治时间是10月3日上午10:00 GMT+0000,因此输出以下代码。
moment.utc(d).toString() // Wed Oct 03 2018 10:00:00 GMT+0000因此,在任何情况下,您都不会得到14:00的时间,因为这个时间戳并不代表这个时间。而时间戳总是绝对的(在格林尼治时间),有no such thing as a local timestamp。
我觉得这里的空白是你的错误解释输入字符串的,你在想..
1538560800000转换为本地日期时间,即10月3日12:00(本地)+0200小时,这意味着把它转到10月3日,14:00但是,正确的阅读方式是..。
1538560800000转换为日期时间,即10月3日10:00(绝对/格林尼治时间)+0200表示源的时区,即GMT+0200。同样,第一种解释是错误的,因为上面提到的原因-- unix时间戳总是在GMT中,它们从来不在本地时区。
发布于 2018-10-04 11:28:36
我也创建了jsfiddle:http://jsfiddle.net/csinghal/dp7rzmw5/34811/
所有格式的代码与以下代码相同:
var localDate = new Date(1538560800000+0200);
var utcFormat = moment(localDate).utc().format('YYYY-MM-DD HH:MM:SS');
var localFormat = moment.utc(utcFormat, 'YYYY-MM-DD
HH:MM:SS').local().format('MM/DD/YYYY hh:mm a');
console.log('LocalDate: ', localDate);
console.log('utcFormat: ', utcFormat);
console.log('localFormat: ', localFormat);https://stackoverflow.com/questions/52645437
复制相似问题