新日期(Date.UTC)的奇怪行为

时间:2019-02-01 15:01:58

标签: javascript datetime

的奇怪的行为new Date(Date.UTC(...)),而从转换的日期的 UTC 以用户的本地时间

我有时间戳记服务器这就好比让2019-02-01 14:28:16,我想这个时间戳当地时间安全的方式转换为用户避免的无效的日期的错误。

但意外的是转换的 2月1日 2月5日即可。这是场景:

const myDate = new Date('2019-02-01 14:28:16');

console.log('Step 1: MyDate: ' + myDate.toString());

const utcFormateOfMyDate = Date.UTC(
  myDate.getFullYear(),
  myDate.getMonth(),
  myDate.getDay(),
  myDate.getHours(),
  myDate.getMinutes(),
  myDate.getSeconds(),
  myDate.getMilliseconds()
);

console.log('Step 2: utcFormateOfMyDate: ' + utcFormateOfMyDate.toString()); // 1549376896000

console.log('Step 3.1 => ' + new Date(utcFormateOfMyDate)); // Tue Feb 05 2019 19:28:16 GMT+0500 (Pakistan Standard Time 

console.log('Step 3.2 => ' + Date(utcFormateOfMyDate)); // Fri Feb 01 2019 19:43:36 GMT+0500 (Pakistan Standard Time)

只有其中我刚添加变化的关键字和转换后的时间戳从跃升的 2月1日 2月5日(适用于未来的);请参阅截图

enter image description here

尽管删除新关键字可以解决问题,但是我找不到此魔术效果的解释。有人可以帮助我了解这种行为吗?

1 个答案:

答案 0 :(得分:1)

如评论中所述,您遇到的问题是,您通过不小心将Date.getDay值(而不是Date.getDate传递给Date.UTC来比较苹果和桔子,并比较了直接解析时间戳的输出结果。就是说,当浏览器实现各不相同时,您不应该依赖new Date()Date()来解析时间戳,并且您可能会得到不一致的结果。

相反,您可以对从服务器获取的时间戳格式执行以下操作:

const timestamp = '2019-02-01 14:28:16';

let [y, m, d, hh, mm, ss] = timestamp.match(/\d+/g);
let date = new Date(Date.UTC(y, m - 1, d, hh, mm, ss));

console.log(JSON.stringify(date));

// date as UTC string
console.log(date.toUTCString());

// date as local string
console.log(date.toString());