Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/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
Javascript 为什么Date.prototype.toString()和Date.prototype.ToLocalString()会返回表示不一致时间点的字符串?_Javascript_Google Chrome_Date_Timezone_V8 - Fatal编程技术网

Javascript 为什么Date.prototype.toString()和Date.prototype.ToLocalString()会返回表示不一致时间点的字符串?

Javascript 为什么Date.prototype.toString()和Date.prototype.ToLocalString()会返回表示不一致时间点的字符串?,javascript,google-chrome,date,timezone,v8,Javascript,Google Chrome,Date,Timezone,V8,对于这个测试用例,toLocalString()似乎没有考虑DST 本地时间是如何按日期计算的(例如,Chrome本身还是通过操作系统应用DST规则),toString()和ToLocalString()的算法有何区别 这是一个bug还是预期的行为 在Chrome/37.0.2062.120上测试,位置为塞浦路斯尼科西亚()凭直觉,我尝试将Windows时区更改为: var d = new Date(); // returns correct value "Fri Sep 26 2014 01

对于这个测试用例,toLocalString()似乎没有考虑DST

本地时间是如何按日期计算的(例如,Chrome本身还是通过操作系统应用DST规则),toString()和ToLocalString()的算法有何区别

这是一个bug还是预期的行为


在Chrome/37.0.2062.120上测试,位置为塞浦路斯尼科西亚()

凭直觉,我尝试将Windows时区更改为:

var d = new Date();

// returns correct value "Fri Sep 26 2014 01:16:31 GMT+0300 (E. Europe Daylight Time)"
d.toString();

// returns incorrect value one hour behind "9/26/2014 12:16:31 AM"
d.toLocaleString();
重新启动Chrome后,我可以得到与您显示的相同的东西:

仔细看看本地化属性:

因此,Chrome似乎不理解时区。这是因为Chrome使用的是Windows时区。该特定时区现在被认为是“不可映射的”——因为没有与该Windows区域匹配的IANA时区标识符

请注意,该区域过去被映射到
亚洲/尼科西亚
,但在CLDR的最新版本中进行了更改,如中所述

产生差异的原因是
toLocaleString
函数使用,而
toString
函数不使用。前者依赖于ICU和CLDR,后者只要求操作系统提供时区字符串

解决方案是让用户将时区切换到正确的设置。就塞浦路斯而言,它应该是:

TZ Key / ID:  "E. Europe Standard Time" 
Display name: "(UTC+02:00) E. Europe"
查看Windows时区控制面板中的选项时:

确保在时区更改后完全关闭所有Chrome窗口,因为Chrome在重新启动之前不会正确初始化时区


现在,in注释仍然是一个问题,因为
Intl.DateTimeFormat().resolvedOptions().timeZone
现在返回
Europe/Kiev
,它应该返回
Asia/Nicosia
,或者
Europe/bu加勒斯特
。但是,至少在大多数情况下,它足以为
toLocaleString返回正确的值。

凭直觉,我尝试将Windows时区更改为:

var d = new Date();

// returns correct value "Fri Sep 26 2014 01:16:31 GMT+0300 (E. Europe Daylight Time)"
d.toString();

// returns incorrect value one hour behind "9/26/2014 12:16:31 AM"
d.toLocaleString();
重新启动Chrome后,我可以得到与您显示的相同的东西:

仔细看看本地化属性:

因此,Chrome似乎不理解时区。这是因为Chrome使用的是Windows时区。该特定时区现在被认为是“不可映射的”——因为没有与该Windows区域匹配的IANA时区标识符

请注意,该区域过去被映射到
亚洲/尼科西亚
,但在CLDR的最新版本中进行了更改,如中所述

产生差异的原因是
toLocaleString
函数使用,而
toString
函数不使用。前者依赖于ICU和CLDR,后者只要求操作系统提供时区字符串

解决方案是让用户将时区切换到正确的设置。就塞浦路斯而言,它应该是:

TZ Key / ID:  "E. Europe Standard Time" 
Display name: "(UTC+02:00) E. Europe"
查看Windows时区控制面板中的选项时:

确保在时区更改后完全关闭所有Chrome窗口,因为Chrome在重新启动之前不会正确初始化时区


现在,in注释仍然是一个问题,因为
Intl.DateTimeFormat().resolvedOptions().timeZone
现在返回
Europe/Kiev
,它应该返回
Asia/Nicosia
,或者
Europe/bu加勒斯特
。但是,至少在大多数情况下,返回
toLocaleString的正确值就足够了。

中对其进行了详细解释。当然,浏览器如何选择实现这两种方法完全取决于实现,但它们应该根据系统设置考虑夏令时。我想,如果你真的在东欧,格式为m/d/y的日期可能会令人困惑,并且与该位置不一致。@RobG-这确实解释了很多问题,而且-这并不能解释此处显示的差异。你能告诉我们你在运行什么操作系统吗,调用
Intl.DateTimeFormat().resolvedOptions().timeZone
@MattJohnson不,它没有,这就是为什么它是一个注释而不是一个答案。大多数浏览器的日期工作方式都有缺陷。在Safari中尝试
newdate('52-02')。toLocaleString()
,然后检查时间。@RobG-:)我下次在Mac上时必须检查一下,但是是的-我知道你的意思。:)这一切都在本文中详细解释过。当然,浏览器如何选择实现这两种方法完全取决于实现,但它们应该根据系统设置考虑夏令时。我想,如果你真的在东欧,格式为m/d/y的日期可能会令人困惑,并且与该位置不一致。@RobG-这确实解释了很多问题,而且-这并不能解释此处显示的差异。你能告诉我们你在运行什么操作系统吗,调用
Intl.DateTimeFormat().resolvedOptions().timeZone
@MattJohnson不,它没有,这就是为什么它是一个注释而不是一个答案。大多数浏览器的日期工作方式都有缺陷。在Safari中尝试
newdate('52-02')。toLocaleString()
,然后检查时间。@RobG-:)我下次在Mac上时必须检查一下,但是是的-我知道你的意思。:)真棒的回答,谢谢!我最初的想法是用
矩().format()
替换
toLocaleString()
。非常简单,并为其他可能受影响的用户修复了该问题。我还将建议用户根据您的建议立即更正其Windows时区。再次感谢你的见解,马特。对此有一个全面的解释是非常令人满意的。FWIW,用户报告的原始设置和观察结果与您的测试一致。确定了。还有,他们的铬