javascript - Angular4/Javascript 日期在使用时区的构造函数调用后发生变化

标签 javascript angular date

在我的 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/

相关文章:

javascript - 如何为http请求设置 "Date" header

IE 的 JavaScript 条件注释

javascript - 浏览器上 dragLeave 事件的奇怪行为

node.js - 在 nest.js 代码库上找不到模块 (MODULE_NOT_FOUND)

angular - rxjs 6 中 concat 和 merge 的区别

python - 两种语言或框架之间的日期序列化是否有标准规则和实践?

excel - 将日期更改为会计年度

javascript - 如何使用 Javascript 从 XML 获取属性值?

javascript - 仅在更改时刷新表

Angular 嵌套树看起来不符合预期