Javascript “新日期(Date.UTC)”的奇怪行为`

Javascript “新日期(Date.UTC)”的奇怪行为`,javascript,datetime,Javascript,Datetime,新日期(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 ut

新日期(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日(将来);请参阅屏幕截图


虽然删除新的关键字解决了问题,但我找不到这种神奇效果的解释。有人能帮我理解这种行为吗?

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

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

const timestamp='2019-02-0114:28:16';
设[y,m,d,hh,mm,ss]=timestamp.match(/\d+/g);
let date=新日期(date.UTC(y,m-1,d,hh,mm,ss));
log(JSON.stringify(date));
//日期作为UTC字符串
log(date.toutString());
//日期作为本地字符串

log(date.toString())不需要“转换”日期。内部总是UTC。我以多种格式获取日期;即使是无效的日期,为了安全起见,我也转换成了bye pass坏格式。但是我发现了这种神奇的行为,它使用了
new
而没有~new~关键字。问题是你调用的是
getDay()
,而不是
getDate()
。对于
Date.UTC(utcformatomydate)
,函数似乎完全忽略了超出范围的年份值。@Pointy我想我们都是这样做的。我不记得有一次我不得不从一个日期对象中抽出一天,而没有被这个方法弄糊涂。。。