将日期转换为本地日期时间

时间:2018-10-04 11:20:52

标签: javascript momentjs

我有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。正确的方法是什么?

2 个答案:

答案 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);