在我的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
这是我的代码:
new Date(this.bsSelected.StatementDate).getMonth()
不确定为什么会发生这种情况以及如何避免这种情况。我的临时解决方案是从API输出中删除TimeZone,但我想知道我是否理解了问题,我可以提出更好的解决方案。
答案 0 :(得分:1)
没有任何改变。 {{1}}是有效的ISO 8601,因此现代浏览器(但不是旧版本)会正确解析。
“Sun Apr 01 1990 00:00:00 GMT-0500(Central Daylight Time)”代表与“1990-03-31T23:00:00-06:00”相同的时刻,但是在不同的时区。您的主机系统设置似乎在该日期具有夏令时(假设您当前的偏移量为-0600),因此不同的时区。
最新版本的ECMA-262要求实施应用历史时区更改,多年来发生了很多变化,因此您无法假设当前规则始终适用(这是ECMA-262的某些版本所需的)。
new Date()。getTimezoneOffset()
将返回当前日期和时间的主机时区偏移量,这可能与不同日期和时间的偏移量不同。
为什么要删除时区?通常的解决方案是始终使用UTC,并在向用户显示日期和时间时仅使用本地值。没有足够的信息说明您如何使用日期来了解最适合您的日期。删除时区仅在所有内容应位于相同(主机确定)时区时才有效。否则,你会遇到问题。
在夏令时期间,它无法解决不同的偏移问题。
另请注意,某些浏览器有解析错误(例如Safari),因此删除时区(即“1990-03-31T23:00:00”)将意味着字符串被视为UTC,而不是本地。
答案 1 :(得分:0)
由于您的浏览器处于不同的GMT,使其成为4月1日。
我的意思是如果GMT-0600是1990年3月31日那么在用户的浏览器中它是1990年4月1日
尝试删除字符串中的偏移部分,浏览器将使用该时间戳作为当前时间。
检查一下:
console.log('With timezone:', new Date('1990-03-31T23:00:00-06:00').getMonth());
console.log('Without timezone:', new Date('1990-03-31T23:00:00').getMonth());
P.S。 getMonth()
返回0到11之间的数字
答案 2 :(得分:0)
当您使用Date对象时,JavaScript始终会转换为您的本地时区。如果您不需要时区信息,则可以执行您正在执行的操作以从数据中删除它。 如果您需要保留时区信息,可以使用第三方库,如Moment Timezone。