我有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:00。正确的方法是什么?
答案 0 :(得分:1)
从字符串创建时刻时,我们首先检查字符串是否 匹配已知的 ISO 8601 格式,然后我们检查字符串是否匹配 RFC 2822 日期时间格式,然后放回新的 日期(字符串)(如果找不到已知格式)。
Moment接受ISO 8601和RFC 2822格式的字符串参数,而您的输入/Date(1538560800000+0200)/
都不是。不过,当您将此参数传递给moment
时,它将尝试将其转换为字符串并最终提取可能的timestamp参数,即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+0200
1538560800000
转换为GMT时为2018年10月3日星期三GMT + 0000,因此输出以下代码..
moment.utc(d).toString() // Wed Oct 03 2018 10:00:00 GMT+0000
因此,在任何情况下您都不会将时间设置为14:00:00,因为此时间戳并不代表该时间。并且时间戳始终是绝对的(在GMT中),其中有no such thing as a local timestamp。
我觉得这是您在想输入字符串的错误解释。
1538560800000
转换为本地日期时间,即10月3日12:00:00(本地)+0200
小时,这意味着将其转到10月3日14:00:00 但是,正确的阅读方式是..
1538560800000
转换为日期时间,即10月3日10:00:00(绝对/格林尼治标准时间)+0200
代表源的时区,即GMT+0200
。再次,由于上述原因,第一种解释是错误的- unix时间戳始终位于格林尼治标准时间(GMT),而从未位于本地时区。
答案 1 :(得分:0)
我也创建了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);