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我想我们都是这样做的。我不记得有一次我不得不从一个日期对象中抽出一天,而没有被这个方法弄糊涂。。。