【问题标题】:Get timezone offset from timezone name using Javascript使用 Javascript 从时区名称获取时区偏移量
【发布时间】:2014-02-15 03:13:20
【问题描述】:

我找到了许多从偏移值中给出时区名称的解决方案。但我有时区名称,我想要它的偏移值。我试过 setTimezone('Asia/Kolkata'),但我认为他们没有像 setTimezone 这样的方法。

示例:

Asia/Kolkata should give me -330 ( offset )

【问题讨论】:

  • 你试过momentjs.com 吗?
  • 让我看看我是否了解您的情况。你有一个 timezeon A,你想得到其他时区 B 之间的时差。我的问题是......你的变量是两个时区,因此两个时区会经常改变?或者只有这个时区中的一个可能会改变,例如有一个带有时区的客户端,而您只有一个知道从客户端到您的服务器的时差?
  • 只有一个时区会改变...服务器的时区是固定的,它是 UTC 0。当客户端时区是亚洲/加尔各答时,我想要那个时区的偏移量(意味着 -330 分钟)。

标签: javascript jquery timezone timezone-offset


【解决方案1】:

你不能单凭名字得到它。您还需要知道具体时间。 Asia/Kolkata 可能固定为单个偏移量,但许多时区在标准时间和夏令时之间交替,因此您不能只获得 the 偏移量,您只能获得 an 偏移量。

有关如何在 JavaScript 中执行此操作,请参阅this answer

【讨论】:

    【解决方案2】:

    使用countries and timezones npm 包:

    import {getTimezone} from 'countries-and-timezones';
    const australianTimezone = 'Australia/Melbourne';
    console.log(getTimezone(australianTimezone));
    

    打印到控制台:

    {
      name: 'Australia/Melbourne',
      country: 'AU',
      utcOffset: 600,
      utcOffsetStr: '+10:00',
      dstOffset: 660,
      dstOffsetStr: '+11:00',
      aliasOf: null
    }
    

    从那里,您可以根据是否是夏令时使用 utcOffset 或 dstOffset。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,这就是我想出的解决方案,如果你能像你提到的那样获得IANA tz database name

      var myTimezoneName = "Asia/Colombo";
       
      // Generating the formatted text
      var options = {timeZone: myTimezoneName, timeZoneName: "short"};
      var dateText = Intl.DateTimeFormat([], options).format(new Date);
       
      // Scraping the numbers we want from the text
      var timezoneString = dateText.split(" ")[1].slice(3);
      
      // Getting the offset
      var timezoneOffset = parseInt(timezoneString.split(':')[0])*60;
      
      // Checking for a minutes offset and adding if appropriate
      if (timezoneString.includes(":")) {
          var timezoneOffset = timezoneOffset + parseInt(timezoneString.split(':')[1]);
      }
      
      

      这不是一个非常不错的解决方案,但它可以在不导入任何内容的情况下完成工作。它依赖于 Intl.DateTimeFormat 的输出格式是否一致,这应该是一致的,但这是一个潜在的警告。

      【讨论】:

      • 谢谢!经过大量搜索,我终于在这里找到了答案。非常感谢。
      • 请注意,它并不总是有效,因为在“短”格式中,某些时区由它们的名称表示,如“PST”而不是它们的偏移量。更好的方法是以“shortOffset”格式打印时区,但 Node.js 不支持此选项。
      【解决方案4】:

      这是使用现代 JavaScript 完成此任务的最简单方法。

      注意:请记住,偏移量取决于夏令时 (DST) 是否有效。

      /* @return A timezone offset in minutes */
      const getOffset = (timeZone = 'UTC', date = new Date()) => {
        const utcDate = new Date(date.toLocaleString('en-US', { timeZone: 'UTC' }));
        const tzDate = new Date(date.toLocaleString('en-US', { timeZone }));
        return (tzDate.getTime() - utcDate.getTime()) / 6e4;
      }
      
      console.log(`No arguments: ${getOffset()}`); // 0
      
      {
        console.log('! Test Case #1 >> Now');
        console.log(`Asia/Colombo     : ${getOffset('Asia/Colombo')}`);     //  330
        console.log(`America/New_York : ${getOffset('America/New_York')}`); // -240
      }
      
      {
        console.log('! Test Case #2 >> DST : off');
        const date = new Date(2021, 0, 1);
        console.log(`Asia/Colombo     : ${getOffset('Asia/Colombo', date)}`);     //  330
        console.log(`America/New_York : ${getOffset('America/New_York', date)}`); // -300
      }
      
      {
        console.log('! Test Case #3 >> DST : on');
        const date = new Date(2021, 5, 1);
        console.log(`Asia/Colombo     : ${getOffset('Asia/Colombo', date)}`);     //  330
        console.log(`America/New_York : ${getOffset('America/New_York', date)}`); // -240
      }
      .as-console-wrapper { top: 0; max-height: 100% !important; }

      【讨论】:

        猜你喜欢
        • 2016-05-07
        • 2020-01-02
        • 2021-04-11
        • 1970-01-01
        • 2020-04-20
        • 2011-02-28
        • 2016-08-06
        • 1970-01-01
        • 2020-12-28
        相关资源
        最近更新 更多