【问题标题】:Get name of time zone获取时区名称
【发布时间】:2013-08-17 06:43:18
【问题描述】:

我可以使用jQuery获取客户端的时区名称吗?

示例:Pacific S.A. 标准时间、格林威治标准时间,例如:https://en.wikipedia.org/wiki/List_of_time_zones_by_country

Timezonelist

【问题讨论】:

  • new Date()的输出是Wed Aug 14 2013 22:02:13 GMT-0700 (Pacific Daylight Time),你能用吗?
  • 没有原生的 JS/jQuery 函数可以做到这一点。一种方法是将 JS (AJAX) 与服务器端代码(例如 PHP)结合起来。查看this 线程中的最佳答案。它结合了 JS 和 PHP,做你想做的。
  • @ItayItai 你觉得我的回答不符合要求吗?它与 OP 给出的列表中的名称相同
  • @Juan Mendes:你说得对,但我是在解释使用 AJAX 完成这项任务的想法。他可以更灵活地使用服务器端代码(假设他需要比你的答案更具体的东西)
  • @Juan Mendes 在 Mac 上的 Safari 中,不是 2013 年 8 月 14 日星期三 22:02:13 GMT-0700(太平洋夏令时间),而是 2013 年 8 月 14 日星期三 22:02:13 GMT-0700 (PCI)。不是我需要的答案,我需要获取时区名称,例如 Pacific S.A. Standard Time, Greenwich Standard Time。感谢您的回复

标签: jquery timezone


【解决方案1】:

我可以使用jQuery获取客户端的时区名称吗?

没有。 jQuery只有一个日期/时间函数,即$.now()

如果你的意思是 JavaScript,答案仍然是 no。您只能从date.getTimezoneOffset() 获取时区偏移。您无法获得时区 - 至少不是在所有浏览器中。参考the timezone tag wiki的标题为:"Time Zone != Offset"的部分

您可以通过使用jsTimeZoneDetect猜测时区,但这只是猜测。它可能准确,也可能不准确。

您现在还可以使用 moment.jsmoment-timezone 插件。它现在支持moment.tz.guess() 的时区猜测。

如果您可以保证您的用户在完全支持ECMAScript Internationalization API 的环境中运行,您可以像这样获取用户的时区:

Intl.DateTimeFormat().resolvedOptions().timeZone

您可以查看DateTimeFormat - resolvedOptions().timezone defaults to the host environment 下的compatibility table,以确定它适用于哪些环境。

老实说,最好的办法就是在某个地方为您的用户提供一个屏幕,让他们可以选择他们的时区。您可以使用下拉列表,也可以使用基于地图的时区选择器 - like this one。您可以使用 jsTimeZoneDetect 作为默认值,但您的用户应该能够更改它。

此外,所有这些都会为您提供 IANA 时区标识符,例如 America/Los_Angeles。但是您提供的示例似乎是 Windows 时区 ID(用于 .net 中的TimeZoneInfo)。你应该阅读the timezone tag wiki,然后还有这个问题:How to translate between Windows and IANA time zones?

【讨论】:

  • @KevalBhatt - 不错!对于有关时区选择器的问题,我会牢记这一点。对于我上面链接的那个来说,这是一个很好的选择。谢谢!
  • (new Date).toString().split('(')[1].slice(0, -1)
  • @Sami - 这不可靠。结果可能是任何东西。不同浏览器的实现差异很大,并且没有规范。
  • 由于与 Intl.DateTimeFormat().resolvedOptions() 的兼容性,这似乎是当今最好的选择。谢谢!
【解决方案2】:

new Date() 的输出是Wed Aug 14 2013 22:02:13 GMT-0700 (Pacific Daylight Time),你能用吗?如果您不需要正式名称,您可以使用括号之间的内容

function getTimeZone() {
    return /\((.*)\)/.exec(new Date().toString())[1];
}

getTimeZone(); // Pacific Daylight Time 

【讨论】:

  • 在 Mac 上的 Safari 中,不是 2013 年 8 月 14 日星期三 22:02:13 GMT-0700(太平洋夏令时间),而是 2013 年 8 月 14 日星期三 22:02:13 GMT-0700 (PCI) .不是我需要的答案,我需要获取时区名称,例如 Pacific S.A. Standard Time, Greenwich Standard Time。感谢您的回复
  • @Juan - 该响应将高度针对浏览器、语言和操作系统。
  • @MattJohnson 如果您习惯于在自己的操作系统、浏览器和语言中查看您的时区,这可能是一件好事 :) 并且您不需要官方时区名称。
  • 如果您想要“太平洋夏令时间”而不是“美国/洛杉矶”,这将很有帮助。但是@MattJohnson-Pint 是对的,这不是很可靠。相反,这是一个特定于浏览器/语言/操作系统的解决方案:stackoverflow.com/a/70376901/775283
【解决方案3】:

下面是使用纯javascript获取时区的替代方法:

(new Date).toString().split('(')[1].slice(0, -1)

【讨论】:

    【解决方案4】:

    获取当前时区标准名称:

    function getTimezoneName() {
        var timeSummer = new Date(Date.UTC(2005, 6, 30, 0, 0, 0, 0));
        var summerOffset = -1 * timeSummer.getTimezoneOffset();
        var timeWinter = new Date(Date.UTC(2005, 12, 30, 0, 0, 0, 0));
        var winterOffset = -1 * timeWinter.getTimezoneOffset();
        var timeZoneHiddenField;
    
        if (-720 == summerOffset && -720 == winterOffset) { timeZoneHiddenField = 'Dateline Standard Time'; }
        else if (-660 == summerOffset && -660 == winterOffset) { timeZoneHiddenField = 'UTC-11'; }
        else if (-660 == summerOffset && -660 == winterOffset) { timeZoneHiddenField = 'Samoa Standard Time'; }
        else if (-660 == summerOffset && -600 == winterOffset) { timeZoneHiddenField = 'Hawaiian Standard Time'; }
        else if (-570 == summerOffset && -570 == winterOffset) { timeZoneHiddenField.value = 'Pacific/Marquesas'; }
        //                else if (-540 == summerOffset && -600 == winterOffset) { timeZoneHiddenField.value = 'America/Adak'; }
        //                else if (-540 == summerOffset && -540 == winterOffset) { timeZoneHiddenField.value = 'Pacific/Gambier'; }
        else if (-480 == summerOffset && -540 == winterOffset) { timeZoneHiddenField = 'Alaskan Standard Time'; }
        //                else if (-480 == summerOffset && -480 == winterOffset) { timeZoneHiddenField = 'Pacific/Pitcairn'; }
        else if (-420 == summerOffset && -480 == winterOffset) { timeZoneHiddenField = 'Pacific Standard Time'; }
        else if (-420 == summerOffset && -420 == winterOffset) { timeZoneHiddenField = 'US Mountain Standard Time'; }
        else if (-360 == summerOffset && -420 == winterOffset) { timeZoneHiddenField = 'Mountain Standard Time'; }
        else if (-360 == summerOffset && -360 == winterOffset) { timeZoneHiddenField = 'Central America Standard Time'; }
        //                else if (-360 == summerOffset && -300 == winterOffset) { timeZoneHiddenField = 'Pacific/Easter'; }
        else if (-300 == summerOffset && -360 == winterOffset) { timeZoneHiddenField = 'Central Standard Time'; }
        else if (-300 == summerOffset && -300 == winterOffset) { timeZoneHiddenField = 'SA Pacific Standard Time'; }
        else if (-240 == summerOffset && -300 == winterOffset) { timeZoneHiddenField = 'Eastern Standard Time'; }
        else if (-270 == summerOffset && -270 == winterOffset) { timeZoneHiddenField = 'Venezuela Standard Time'; }
        else if (-240 == summerOffset && -240 == winterOffset) { timeZoneHiddenField = 'SA Western Standard Time'; }
        else if (-240 == summerOffset && -180 == winterOffset) { timeZoneHiddenField = 'Central Brazilian Standard Time'; }
        else if (-180 == summerOffset && -240 == winterOffset) { timeZoneHiddenField = 'Atlantic Standard Time'; }
        else if (-180 == summerOffset && -180 == winterOffset) { timeZoneHiddenField = 'Montevideo Standard Time'; }
        else if (-180 == summerOffset && -120 == winterOffset) { timeZoneHiddenField = 'E. South America Standard Time'; }
        else if (-150 == summerOffset && -210 == winterOffset) { timeZoneHiddenField = 'Mid-Atlantic Standard Time'; }
        else if (-120 == summerOffset && -180 == winterOffset) { timeZoneHiddenField = 'America/Godthab'; }
        else if (-120 == summerOffset && -120 == winterOffset) { timeZoneHiddenField = 'SA Eastern Standard Time'; }
        else if (-60 == summerOffset && -60 == winterOffset) { timeZoneHiddenField = 'Cape Verde Standard Time'; }
        else if (0 == summerOffset && -60 == winterOffset) { timeZoneHiddenField = 'Azores Daylight Time'; }
        else if (0 == summerOffset && 0 == winterOffset) { timeZoneHiddenField = 'Morocco Standard Time'; }
        else if (60 == summerOffset && 0 == winterOffset) { timeZoneHiddenField = 'GMT Standard Time'; }
        else if (60 == summerOffset && 60 == winterOffset) { timeZoneHiddenField = 'Africa/Algiers'; }
        else if (60 == summerOffset && 120 == winterOffset) { timeZoneHiddenField = 'Namibia Standard Time'; }
        else if (120 == summerOffset && 60 == winterOffset) { timeZoneHiddenField = 'Central European Standard Time'; }
        else if (120 == summerOffset && 120 == winterOffset) { timeZoneHiddenField = 'South Africa Standard Time'; }
        else if (180 == summerOffset && 120 == winterOffset) { timeZoneHiddenField = 'GTB Standard Time'; }
        else if (180 == summerOffset && 180 == winterOffset) { timeZoneHiddenField = 'E. Africa Standard Time'; }
        else if (240 == summerOffset && 180 == winterOffset) { timeZoneHiddenField = 'Russian Standard Time'; }
        else if (240 == summerOffset && 240 == winterOffset) { timeZoneHiddenField = 'Arabian Standard Time'; }
        else if (270 == summerOffset && 210 == winterOffset) { timeZoneHiddenField = 'Iran Standard Time'; }
        else if (270 == summerOffset && 270 == winterOffset) { timeZoneHiddenField = 'Afghanistan Standard Time'; }
        else if (300 == summerOffset && 240 == winterOffset) { timeZoneHiddenField = 'Pakistan Standard Time'; }
        else if (300 == summerOffset && 300 == winterOffset) { timeZoneHiddenField = 'West Asia Standard Time'; }
        else if (330 == summerOffset && 330 == winterOffset) { timeZoneHiddenField = 'India Standard Time'; }
        else if (345 == summerOffset && 345 == winterOffset) { timeZoneHiddenField = 'Nepal Standard Time'; }
        else if (360 == summerOffset && 300 == winterOffset) { timeZoneHiddenField = 'N. Central Asia Standard Time'; }
        else if (360 == summerOffset && 360 == winterOffset) { timeZoneHiddenField = 'Central Asia Standard Time'; }
        else if (390 == summerOffset && 390 == winterOffset) { timeZoneHiddenField = 'Myanmar Standard Time'; }
        else if (420 == summerOffset && 360 == winterOffset) { timeZoneHiddenField = 'North Asia Standard Time'; }
        else if (420 == summerOffset && 420 == winterOffset) { timeZoneHiddenField = 'SE Asia Standard Time'; }
        else if (480 == summerOffset && 420 == winterOffset) { timeZoneHiddenField = 'North Asia East Standard Time'; }
        else if (480 == summerOffset && 480 == winterOffset) { timeZoneHiddenField = 'China Standard Time'; }
        else if (540 == summerOffset && 480 == winterOffset) { timeZoneHiddenField = 'Yakutsk Standard Time'; }
        else if (540 == summerOffset && 540 == winterOffset) { timeZoneHiddenField = 'Tokyo Standard Time'; }
        else if (570 == summerOffset && 570 == winterOffset) { timeZoneHiddenField = 'Cen. Australia Standard Time'; }
        else if (570 == summerOffset && 630 == winterOffset) { timeZoneHiddenField = 'Australia/Adelaide'; }
        else if (600 == summerOffset && 540 == winterOffset) { timeZoneHiddenField = 'Asia/Yakutsk'; }
        else if (600 == summerOffset && 600 == winterOffset) { timeZoneHiddenField = 'E. Australia Standard Time'; }
        else if (600 == summerOffset && 660 == winterOffset) { timeZoneHiddenField = 'AUS Eastern Standard Time'; }
        else if (630 == summerOffset && 660 == winterOffset) { timeZoneHiddenField = 'Australia/Lord_Howe'; }
        else if (660 == summerOffset && 600 == winterOffset) { timeZoneHiddenField = 'Tasmania Standard Time'; }
        else if (660 == summerOffset && 660 == winterOffset) { timeZoneHiddenField = 'West Pacific Standard Time'; }
        else if (690 == summerOffset && 690 == winterOffset) { timeZoneHiddenField = 'Central Pacific Standard Time'; }
        else if (720 == summerOffset && 660 == winterOffset) { timeZoneHiddenField = 'Magadan Standard Time'; }
        else if (720 == summerOffset && 720 == winterOffset) { timeZoneHiddenField = 'Fiji Standard Time'; }
        else if (720 == summerOffset && 780 == winterOffset) { timeZoneHiddenField = 'New Zealand Standard Time'; }
        else if (765 == summerOffset && 825 == winterOffset) { timeZoneHiddenField = 'Pacific/Chatham'; }
        else if (780 == summerOffset && 780 == winterOffset) { timeZoneHiddenField = 'Tonga Standard Time'; }
        else if (840 == summerOffset && 840 == winterOffset) { timeZoneHiddenField = 'Pacific/Kiritimati'; }
        else { timeZoneHiddenField = 'US/Pacific'; }
        return timeZoneHiddenField;
    }
    

    【讨论】:

    • 为什么我们需要两个参数(summerOffset、winterOffset)?
    • @PhucNguyen 有些时区遵守夏令时,有些则不遵守。
    • 就像宝莱坞电影!
    • 请注意,巴西不再有夏令时,所以这已经过时了...timeanddate.com/time/change/brazil
    【解决方案5】:

    找到了我在 moment.js 中使用的这个脚本:

    http://pellepim.bitbucket.org/jstz/

    此脚本允许获取浏览器的时区名称,如下例所示:

    > var timezone = jstz.determine();
    > timezone.name(); 
    "America/New_York"
    

    它不在 jQuery 中,但是...

    【讨论】:

    • 欢迎来到 StackOverflow!只发布一个链接,没有相关的代码示例,并不是很有帮助。请尽量避免在没有更多信息的情况下仅发布链接。
    • 很遗憾,这个库不是最新的,所以可能会错误地检测到某些时区。
    【解决方案6】:

    在纯javascript中使用正则表达式,

    var d = new Date();
    var s = d.toString();
    var zoneName = s.match(".*(\\((.*)\\))")[2];
    

    【讨论】:

      【解决方案7】:

      想不出任何使用 Jquery 的方法。您可以使用 PHP 获取远程用户国家名称,然后将输出与:

      1) 一系列应用节能时间的国家(不多)。

      2) 当前日期。

      要获取用户所在的国家/地区:

      function visitor_country() {
          $ip = $_SERVER["REMOTE_ADDR"];
          if(filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP))
                  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
          if(filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP))
                  $ip = $_SERVER['HTTP_CLIENT_IP'];
          $result = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip))
                  ->geoplugin_countryName;
          return $result <> NULL ? $result : "Unknown";
      }
      echo visitor_country(); // Output Country name [Ex: United States]
      ?>
      

      这个世界时区地图链接可用于创建数组: http://www.worldtimezone.com/daylight.html

      希望这个想法对你有用!

      【讨论】:

        【解决方案8】:

        console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
        Intl.DateTimeFormat().resolvedOptions().timeZone
        

        【讨论】:

          【解决方案9】:

          这些链接可能会对您有所帮助timeZone using Jquery

          或者下面的代码可能会帮助你

          var offset = (new Date()).getTimezoneOffset();
          alert(offset);
          

          结帐JSFIddle 实施或更多解释请访问SolutionScott

          仅适用于时区

          function get_time_zone_offset( ) {
              var current_date = new Date();
            alert(current_date);   
            //return -current_date.getTimezoneOffset() / 60;
          
          }
          

          警报弹出窗口也会显示时区,您可以根据需要对其进行重构,请在 JS Fiddle 中查看

          【讨论】:

          • 感谢您的回复,但我不想获得偏移编号,我想获得像“太平洋 S.A. 标准时间,格林威治标准时间”这样的时区名称。
          • @NathanNguyễn 您可以根据您的要求格式化 JS Fiddle 代码以返回时区名称。
          【解决方案10】:

          使用 moment.js + moment-timezones.js

          moment.tz.guess();

          https://github.com/moment/moment-timezone/issues/138

          【讨论】:

            【解决方案11】:

            这个网站有一些很好的例子

            https://www.geeksforgeeks.org/javascript-date-now/

            // Use of Date.now() function 
            var d = Date(Date.now()); 
            
            // Converting the number of millisecond in date string 
            a = d.toString() 
            
            // Printing the current date                     
            document.write("The current date is: " + a)  
            

            【讨论】:

              【解决方案12】:

              现代方法

              Matt Johnson-Pint's answerIANA time zone database (tzdata) 格式给出诸如"America/Los_Angeles" 之类的输出:

              Intl.DateTimeFormat().resolvedOptions().timeZone
              
              // -> "America/Los_Angeles"
              

              console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);

              如果您更喜欢时区的确切名称,例如"Pacific Standard Time",您可以使用以下表达式:

              Intl.DateTimeFormat(undefined, { timeZoneName: "long" })
                      .formatToParts(new Date())
                      .find((part) => part.type === "timeZoneName").value
              
              // -> "Pacific Standard Time"
              

              console.log(Intl.DateTimeFormat(undefined, { timeZoneName: "long" }).formatToParts(new Date()).find((part) =&gt; part.type === "timeZoneName").value);

              这应该比Juan Mendes's answer 更有效,因为该方法通过精确匹配(new Date()).toString() 的输出来工作。但是对于使用不同语言、浏览器或操作系统的其他人来说,所有的赌注都没有了。上面的表达式应该更健壮。

              所有现代浏览器都支持此功能,甚至 Safari。它在 Internet Explorer 中不起作用。更多详情请关注browser compatibility chart

              【讨论】:

                【解决方案13】:

                我知道这个问题很老,但我想出了一个小解决方案:

                (new Date).toLocaleString('en-US', {
                    hour12: false,
                    hour: '2-digit',
                    timeZoneName: 'long'
                }).replace(/^\d\d /, '');
                

                我没有对此进行广泛测试,但对于我的浏览器,这给了我:

                "Mountain Daylight Time"
                

                希望这对那里的人有所帮助。

                【讨论】:

                • @Gujamin:很遗憾,你是对的。看起来 Safari 完全忽略了提供的选项对象,Chrome 和其他有礼貌的浏览器礼貌地看待它。有人知道以长字符串格式获取时区的简洁跨平台方法吗?
                • 我最终只使用了 user3119287 的答案。不理想,但有效。
                • 即使在 IE 中也无法正常工作。它没有给出时区名称
                【解决方案14】:

                没有直接的方法,但你可以这样做:

                var dd = new Date(); var d = dd.toString();

                var startOff= d.indexOf('(') + 1; var endOff= d.lastIndexOf(')');

                var str = d.substring(startOff , endOff);

                我创建了一个 JS fiddle,您可以在其中看到警报: JSFiddle

                var dd = new Date();
                var d = dd.toString();
                
                alert(d);
                var startOff= d.indexOf('(') + 1;
                alert(startOff);
                var endOff= d.lastIndexOf(')');
                alert(startOff+ "  : " + endOff);
                
                var str = d.substring(startOff , endOff);
                alert(str);
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-12-28
                  • 1970-01-01
                  • 2021-11-28
                  • 2013-03-03
                  • 1970-01-01
                  • 2011-02-28
                  • 2012-04-04
                  相关资源
                  最近更新 更多