Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular4/Javascript在带有时区的日期构造函数调用之后更改日期_Javascript_Angular_Date - Fatal编程技术网

Angular4/Javascript在带有时区的日期构造函数调用之后更改日期

Angular4/Javascript在带有时区的日期构造函数调用之后更改日期,javascript,angular,date,Javascript,Angular,Date,在Angular 4应用程序中,我从API调用中获得的日期为'1990-03-31T23:00:00-06:00'字符串,但当尝试创建日期对象并执行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

在Angular 4应用程序中,我从API调用中获得的日期为'1990-03-31T23:00:00-06:00'字符串,但当尝试创建日期对象并执行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输出中删除时区,但我不知道我是否理解这个问题,我可以想出一个更好的解决方案

因为您的浏览器处于不同的格林尼治标准时间,所以将成为4月1日

我的意思是,如果GMT-0600是1990年3月31日,那么在用户浏览器中是1990年4月1日

尝试删除字符串中的偏移部分,浏览器将使用该时间戳作为当前时间

勾选这个:

控制台。记录“时区:”,新日期“1990-03-31T23:00:00-06:00”。getMonth;
控制台。日志“无时区:”,新日期“1990-03-31T23:00:00”。getMonth 当您使用Date对象时,JavaScript总是转换为本地时区。如果你不需要时区信息,你可以做你已经在做的事情,把它从数据中去掉。 如果需要保留时区信息,可以使用第三方库,如。

没有任何更改。新的日期“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版本所要求的

新日期。getTimezoneOffset

将返回当前日期和时间的主机时区偏移量,该偏移量可能与不同日期和时间的偏移量不同

为什么要删除时区?通常的解决方案是在向用户显示日期和时间时始终使用UTC,并且仅使用本地值。没有足够的信息说明你是如何利用这个日期来知道什么最适合你。只有当所有内容都应位于同一主机确定的时区时,删除时区才有效。否则,您将遇到问题

而且它不会解决在夏令时有不同偏移的问题


还请注意,某些浏览器存在解析错误,例如Safari,因此删除时区(即1990-03-31T23:00:00)将意味着字符串被视为UTC,而不是本地。

原始时间戳是UTC-0600,而输出字符串是UTC-0500。1990-03-31T23:00:00-06:00和Sun Apr 01 1990 00:00:00 GMT-0500代表同一时间点。似乎您的主机正在为该日期和时间应用夏时制更正,这是根据EMCA-262要求执行的。还要记住,月份是零索引的:三月是2,四月是3。答案和分数非常正确,我的主要问题是我的系统在-06:00,但每次我做任何与日期相关的事情时,它都设置为-05:00。现在是2017年7月12日,芝加哥不是夏令时。我在Windows 10上,在进入我的时间设置并三次检查我是否在正确的时区UTC-06:00中央时间后,我意识到夏令时自动切换有一个调整。关闭该功能后,浏览器正确地获取了我的时区。我只是想从API中加载那个日期,并将月份和年份设置为从0开始的下拉索引。好的,但是1990年3月31日可能是夏时制期间,因此为-0500。夏令时基于行政边界和时区,因此位置也很重要,即在同一时区中,有一个地方遵守夏令时,另一个不遵守,还有一些在不同时间或日期改变DST的数据。哦,我没有想到,即使输入没有CSD中心,JavaScript/浏览器也会知道1990年3月31日实际上是日光节约并修复它。这就解释了!谢谢你的帮助,这是一个令人困惑的过程。