在我的 Angular 4 应用程序中,我从 API 调用中获取了一个日期,格式为“1990-03-31T23:00:00-06:00”字符串,但是当尝试创建 Date 对象并执行 getMonth() 时,我'我弄错了日子。在控制台中进行测试后:
> var x = new Date('1990-03-31T23:00:00-06:00');
undefined
> x
Sun Apr 01 1990 00:00:00 GMT-0500 (Central Daylight Time)
> var x = new Date('1990-03-31T23:00:00');
Sat Mar 31 1990 23:00:00 GMT-0500 (Central Daylight Time)
> new Date().getTimezoneOffset();
360
这是我的代码:
新日期(this.bsSelected.StatementDate).getMonth()
不知道为什么会发生这种情况以及如何避免它。我的临时解决方案是从 API 输出中删除 TimeZone,但我想知道我是否理解这个问题,我可以提出更好的解决方案。
最佳答案
没有任何改变。 new Date('1990-03-31T23:00:00-06:00')
是有效的 ISO 8601,因此可以被现代浏览器正确解析(但不能被旧浏览器解析)。
“Sun Apr 01 1990 00:00:00 GMT-0500(中部夏令时间)”表示与“1990-03-31T23:00:00-06:00”相同的时刻,但位于不同的时区。您的主机系统设置似乎对该日期有夏令时(假设您当前的偏移量是-0600),因此时区不同。
ECMA-262 的最新版本需要实现应用历史时区更改,多年来发生了许多更改,因此您不能假设始终应用当前规则(这是某些版本的 ECMA-262 所要求的)。
new Date().getTimezoneOffset()
将返回当前日期和时间的主机时区偏移量,该偏移量可能与不同日期和时间的偏移量不同。
为什么要删除时区?通常的解决方案是始终使用 UTC,并且在向用户显示日期和时间时仅使用本地值。没有足够的信息来说明您如何使用日期来了解什么最适合您。仅当所有内容都应位于同一(主机确定的)时区时,删除时区才有效。否则,您会遇到问题。
并且它无法解决夏令时期间出现不同偏移的问题。
另请注意,某些浏览器存在解析错误(例如 Safari),因此删除时区(即“1990-03-31T23:00:00”)将意味着该字符串被视为 UTC,而不是本地。
关于javascript - Angular4/Javascript 日期在使用时区的构造函数调用后发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47704779/