Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.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 如何解决在Edge和chrome中获取不同时区名称的问题_Javascript_Jquery_Timezone_Timezone Offset - Fatal编程技术网

Javascript 如何解决在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,

我需要使用下面的代码使用Jquery获取时区名称

当我在系统设置中选择UTC+5.30(钦奈、加尔各答、孟买、新德里)时区时,我将在edge和chrome浏览器中获得
“印度标准时间”

但当我在设置中切换到(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
      分配给
      India
      CLDR元区域

      
      
    • 然后,它使用活动语言文件,例如确定要用于
      India
      元区域的显示名称

      
      印度标准时间
      
      这将成为
      Date.prototype.toString
      中括号中返回的
      tzName

请注意,虽然Edge和Chrome对
Date.prototype.toString
输出使用不同的源,但Edge也使用CLDR来实现。这在以下情况下可见:

new Date().toLocaleString(未定义,{timeZoneName:'long'})
将您的时区设置为斯里兰卡后,Edge和Chrome将返回:

“2019年8月16日,印度标准时间晚上10:41:31”
其他几点:

  • 请注意,显示值也会因操作系统的语言设置以及所提供日期的时区部分而改变。例如,在美国太平洋时区的英语中,您将看到
    “太平洋标准时间”
    “太平洋夏令时”
    。您将看到法语、日语等不同的值。因此,它仅用于向最终用户显示。不应将其分开分析并将其视为标识符

  • 要获取实际IANA tzdb标识符,如
    亚洲/科伦坡
    亚洲/加尔各答
    美国/洛杉矶
    ,请参阅


被这个愚弄了?同意,但这一刻只是实现这一点的一种方式。看见