Javascript 如何解决在Edge和chrome中获取不同时区名称的问题
我需要使用下面的代码使用Jquery获取时区名称 当我在系统设置中选择UTC+5.30(钦奈、加尔各答、孟买、新德里)时区时,我将在edge和chrome浏览器中获得Javascript 如何解决在Edge和chrome中获取不同时区名称的问题,javascript,jquery,timezone,timezone-offset,Javascript,Jquery,Timezone,Timezone Offset,我需要使用下面的代码使用Jquery获取时区名称 当我在系统设置中选择UTC+5.30(钦奈、加尔各答、孟买、新德里)时区时,我将在edge和chrome浏览器中获得“印度标准时间” 但当我在设置中切换到(UTC+5.30)Sri Jayawardenepura时,Chrome显示的是“印度标准时间”,Edge显示的是“斯里兰卡标准时间”,这是正确的。有人能找出为什么会有这种差异并给我一个解决方案吗 我用过 (new Date).toString().split('(')[1].slice(0,
“印度标准时间”
但当我在设置中切换到(UTC+5.30)Sri Jayawardenepura时,Chrome显示的是“印度标准时间”
,Edge显示的是“斯里兰卡标准时间”
,这是正确的。有人能找出为什么会有这种差异并给我一个解决方案吗
我用过
(new Date).toString().split('(')[1].slice(0, -1);
var timeZone = (new Date).toString().split('(')[1].slice(0, -1);
时区令人困惑 您需要的是时区名称 时区名称通常采用“亚洲/城市名称”的形式 除了日期和utc偏移量之外,您还需要进行时间转换(并且在转换为本地时间之前始终以utc进行转换) 从chrome或edge获得的时区偏移名称可能会随着年份的变化而变化,如果您正在查看的位置遵守夏令时,那么使用它是不正确的 对于时间/时区查找,请使用momentjs时区
您使用的方法从
Date.prototype.toString
的输出中提取括号中的值。该值由第节中TimeZoneString
下的tzName
定义(我撰写本文时为10.0)
上面写着(我的):
让tzName为实现定义的字符串,它是空字符串或代码单元0x0020(空格)、代码单元0x0028(左括号)、与实现相关的时区名称和代码单元0x0029(右括号)的字符串串联
因此,您不应该期望它们是任何特定浏览器上的任何特定值,也不应该期望它们匹配
也就是说,我可以解释你注意到的行为
- Edge从与所选时区关联的本地化显示名称中获取其
值。它们位于注册表中的tzName
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\TimeZones\斯里兰卡标准时间
,位于
或Std
字段中,以您使用的日期有效的为准Dlt
- Chrome从国际化数据中获取其
值(通过):tzName
- 它首先使用该文件将
Windows时区ID映射到斯里兰卡标准时间
时区ID亚洲/科伦坡
- 然后,它使用该文件将
分配给Asia/Colombo
CLDR元区域India
- 然后,它使用活动语言文件,例如确定要用于
元区域的显示名称India
这将成为印度标准时间
中括号中返回的Date.prototype.toString
tzName
- 它首先使用该文件将
Date.prototype.toString
输出使用不同的源,但Edge也使用CLDR来实现。这在以下情况下可见:
new Date().toLocaleString(未定义,{timeZoneName:'long'})
将您的时区设置为斯里兰卡后,Edge和Chrome将返回:
“2019年8月16日,印度标准时间晚上10:41:31”
其他几点:
- 请注意,显示值也会因操作系统的语言设置以及所提供日期的时区部分而改变。例如,在美国太平洋时区的英语中,您将看到
或“太平洋标准时间”
。您将看到法语、日语等不同的值。因此,它仅用于向最终用户显示。不应将其分开分析并将其视为标识符“太平洋夏令时”
- 要获取实际IANA tzdb标识符,如
或亚洲/科伦坡
或亚洲/加尔各答
,请参阅美国/洛杉矶