我需要使用下面的代码使用Jquery获取TimeZone名称。
当我在系统设置中选择UTC+5.30(chennai,kolkatta,mumbai,newdelhi)
时区时,在Edge和chrome浏览器中会显示"India Standard Time"
。
但是,当我在设置中更改为(UTC + 5.30)Sri Jayawardenepura时,Chrome显示"India Standard Time"
,Edge显示"Srilanka Standard Time"
,这是正确的。有谁能找到原因所在并给我解决方案?
我用过了
(new Date).toString().split('(')[1].slice(0, -1);
var timeZone = (new Date).toString().split('(')[1].slice(0, -1);
最佳答案
您正在使用的方法从Date.prototype.toString
的输出中提取括号中的值。该值由20.3.4.41.3 of the current ECMAScript spec部分中tzName
下的TimeZoneString
定义(在撰写本文时为10.0)。
它说(强调我的):
令tzName为实现定义的字符串,它可以是空字符串或代码单元0x0020(SPACE),代码单元0x0028(LEFT PARENTHESIS),实现相关的时区名称和代码单元0x0029(正确的PARENTHESIS)。
因此,您不应期望它们在任何特定的浏览器上具有任何特定的值,也不应期望它们匹配。
也就是说,我可以解释您注意到的行为。
Edge从与您选择的时区关联的本地化显示名称中获取其tzName
值。它们位于注册表中HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Sri Lanka Standard Time
,Std
或Dlt
字段中,以您使用日期为准。
Chrome从Unicode CLDR国际化数据(通过ICU)中获取其tzName
值:
它首先使用windowsZones.xml
文件将Sri Lanka Standard Time
Windows时区ID映射到Asia/Colombo
IANA时区ID。
<!-- (UTC+05:30) Sri Jayawardenepura -->
<mapZone other="Sri Lanka Standard Time" territory="001" type="Asia/Colombo"/>
<mapZone other="Sri Lanka Standard Time" territory="LK" type="Asia/Colombo"/>
然后,它使用
metaZones.xml
文件将Asia/Colombo
分配给India
CLDR MetaZone。<timezone type="Asia/Colombo">
<usesMetazone to="1996-05-24 18:30" mzone="India"/>
<usesMetazone to="2006-04-14 18:30" from="1996-05-24 18:30" mzone="Lanka"/>
<usesMetazone from="2006-04-14 18:30" mzone="India"/>
</timezone>
然后,它使用活动语言文件(例如
en.xml
)确定用于India
MetaZone的显示名称。<metazone type="India">
<long>
<standard>India Standard Time</standard>
</long>
</metazone>
这成为
tzName
中括号中返回的Date.prototype.toString
。请注意,尽管Edge和Chrome为
Date.prototype.toString
输出使用不同的源,但是Edge的ECMAScript Internationalization API实现也使用CLDR。这是可见的以下内容:new Date().toLocaleString(undefined, {timeZoneName: 'long'})
将您的时区设置为斯里兰卡时,Edge和Chrome都将返回:
"8/16/2019, 10:41:31 PM India Standard Time"
其他几点:
请注意,显示值也将根据操作系统的语言设置以及所提供日期的有效时区部分而改变。例如,在美国太平洋时区,使用英语,您将看到
"Pacific Standard Time"
或"Pacific Daylight Time"
。您会看到法文,日文等不同的值。因此,该值仅用于向最终用户显示。不应将其解析为标识符。要获取实际的IANA tzdb标识符,例如
Asia/Colombo
或Asia/Kolkata
或America/Los_Angeles
,请参见https://stackoverflow.com/a/22625076/634824关于javascript - 如何解决在Edge和Chrome中获取不同时区名称的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57524457/