【问题标题】:Get time of specific timezone [duplicate]获取特定时区的时间[重复]
【发布时间】:2012-01-02 16:57:28
【问题描述】:

我正在使用 JavaScript Date 类并尝试使用 getDate() 方法获取当前日期。但显然它正在加载系统日期和时间。我正在从印度运行代码,但我想使用相同的方法获取英国的日期和时间。我该怎么做?

【问题讨论】:

标签: javascript date time timezone


【解决方案1】:

来自客户端的简短回答:不,您必须从服务器端获取它。

【讨论】:

  • 你错了。在服务器上实际上更困难,因为客户端知道它在哪个时区,以及它在那里的时间。服务器只有这个等式的一半。
  • 这似乎是 OP 实际问题的唯一答案。无论客户身在何处,OP 都希望获得英国时间。您可以获得英国时区的 UTC 时间,但无法轻松确定是否为 DST。
  • UTC 不是英国的时区。这是一个常见的误解。 UTC 没有时区,是标准的。英国冬季与UTC相同,夏季为UTC+1。英国的时区是英国标准时间或英国夏令时间(两者都缩写为 BST...只是为了增加混乱!)
  • 对于客户端,我们使用Java Script。
【解决方案2】:

您可以使用getUTCDate() 和相关的getUTC...() 方法来访问基于UTC 时间的时间,然后进行转换。

如果您愿意,您可以使用valueOf(),它返回自 Unix 纪元以来的 UTC 秒数,并使用它,但它可能会涉及更多。

【讨论】:

    【解决方案3】:

    .getTimezoneOffset() 方法应该可以工作。这将获得您的时区和 GMT 之间的时间。然后你可以计算到任何你想要的。

    【讨论】:

      【解决方案4】:

      如果您有正确的日期和时间真的很重要;最好在您的服务器(当然,您在 UTC 中运行)上有一个服务来返回时间。然后,您可以在客户端上创建一个新日期并比较这些值,并在必要时调整所有日期与服务器时间的偏移量。

      为什么要这样做?我有一些难以重现的错误报告,因为我无法在服务器日志中找到错误消息,直到我注意到错误报告是在我收到它的两天后寄出的。您可以可能信任浏览器在收到 UTC 时间戳时正确处理时区转换,但您显然不能相信用户正确设置了系统时钟。 (如果用户的时区设置也错误,实际上没有任何解决方案;除了以“本地”时间打印当前服务器时间)

      【讨论】:

        【解决方案5】:

        在你太兴奋之前,这是 2011 年写的

        如果我现在要这样做,我会使用Intl.DateTimeFormat。这是一个链接,让您了解support this had in 2011 的类型

        原来的答案现在(非常)过时了

        Date.getTimezoneOffset()

        getTimezoneOffset() 方法返回格林威治标准时间 (GMT) 与本地时间之间的时差,以分钟为单位。

        例如,如果您的时区是 GMT+2,则将返回 -120。

        注意:此方法始终与 Date 对象结合使用。

        var d = new Date()
        var gmtHours = -d.getTimezoneOffset()/60;
        document.write("The local time zone is: GMT " + gmtHours);
        //output:The local time zone is: GMT 11
        

        【讨论】:

          【解决方案6】:

          如果您知道 UTC 偏移量,那么您可以使用以下函数传递它并获取时间:

          function calcTime(city, offset) {
              // create Date object for current location
              var d = new Date();
          
              // convert to msec
              // subtract local time zone offset
              // get UTC time in msec
              var utc = d.getTime() + (d.getTimezoneOffset() * 60000);
          
              // create new Date object for different city
              // using supplied offset
              var nd = new Date(utc + (3600000*offset));
          
              // return time as a string
              return "The local time for city"+ city +" is "+ nd.toLocaleString();
          }
          
          alert(calcTime('Bombay', '+5.5'));
          

          取自:Convert Local Time to Another

          【讨论】:

          • 您的utc 有问题。 d.getTime is 已经以 UTC 毫秒为单位。然而,您需要使用.toUTCString(),而不是toLocaleString()
          • 请记住,位置的偏移量可能会发生变化(夏令时/英国夏令时)。
          • 您实际上需要减去 getTimezoneOffset 输出而不是添加它 - 该偏移量用于从本地时间到 UTC,而不是相反。
          • 可以更改格式吗?例如,我只需要小时、分钟、秒和 AM/PM 的时间
          • 这不是一个好的答案。如果您在偏移量中硬编码,如果它有夏令时,您将关闭大约半年。
          【解决方案7】:

          你可以使用Intl.DateTimeFormat

          let options = {
              timeZone: 'Europe/London',
              year: 'numeric',
              month: 'numeric',
              day: 'numeric',
              hour: 'numeric',
              minute: 'numeric',
              second: 'numeric',
            },
            formatter = new Intl.DateTimeFormat([], options);
          
          console.log(formatter.format(new Date()));

          或者,如果您只格式化一次而不是批量使用Date.prototype.toLocaleDateString()

          (new Date()).toLocaleString([], options)
          

          不幸的是,浏览器不需要理解 UTC 以外的时区,因此try 这些块并找出替代方案以防万一失败,例如从服务器获取时区偏移量。 p>

          【讨论】:

          • 这适用于 Chrome,但不适用于 Firefox。
          • 正确答案,它被称为国际API,并且是内置的,在大多数较新的浏览器中,您应该先检查它是否存在..自然... - 参考:Intl跨度>
          • 这在 Safari 中仍然不起作用。
          • 这很好用。以下是浏览器支持列表:caniuse.com/#search=Intl
          • 在 Google 表格应用脚本中工作。
          【解决方案8】:

          最好的方法是使用getLocaleString,像这样:

          创建一个日期对象:

          date = new Date(0)
          

          如果你在柏林,这应该转换成这个字符串:

          1970 年 1 月 1 日星期四 01:00:00 GMT+0100 (CET)

          获取雅典的时间:

          date.toLocaleString('de-DE', {hour: '2-digit',   hour12: false, timeZone: 'Europe/Athens' })
          

          '02'

          获取上海的营业时间:

          date.toLocaleString('de-DE', {hour: '2-digit',   hour12: false, timeZone: 'Asia/Shanghai' })
          

          '08'

          【讨论】:

          • 旁注:Date.prototype.toLocaleString 仅适用于 IE11+、Firefox 29+、Safari 11+ 等。请参阅 this
          • 不仅如此。 IANA 时区名称仅适用于 chrome 和 firefox ..
          • 首先,您应该使用“en-US”,因为它是 Node
          【解决方案9】:

          这是获取##的正确方法

          function getTime(offset)
                  {
                      var d = new Date();
                      localTime = d.getTime();
                      localOffset = d.getTimezoneOffset() * 60000;
          
                      // obtain UTC time in msec
                      utc = localTime + localOffset;
                      // create new Date object for different city
                      // using supplied offset
                      var nd = new Date(utc + (3600000*offset));
                      //nd = 3600000 + nd;
                      utc = new Date(utc);
                      // return time as a string
                      $("#local").html(nd.toLocaleString());
                      $("#utc").html(utc.toLocaleString());
                  }
          

          【讨论】:

          • 如果有人想知道如何调用此函数,那么如果您想获得印度时间 getTime(5.5);
          • 此线程中所有建议的方法都不考虑夏令时(适用的地方),因此最好使用时刻时区库来简化生活。
          • 投反对票,因为答案希望 OP 知道偏移量。大概 OP 正在使用时区字符串,尽管他没有明确说明这一点。 OP 需要使用 Intl API,或者像 Luxon 或 Moment 这样的库。
          • @AdamLeggett 对几乎任何位置的简单 Google 搜索在专有结果中都有 UTC+/-#,因此假设 OP 无法完成如此简单的任务有点不公平。
          • @AbandonedCart 对于大多数编程目的来说,答案不够通用,除非它包括如何检索偏移量的答案。这绝不是简单的 - 偏移量可以在一年中变化,并且在历史上的大多数地区至少改变了几次。所有这些的数据库都很大。
          猜你喜欢
          • 2019-10-01
          • 2016-08-23
          • 1970-01-01
          • 2021-03-13
          • 1970-01-01
          • 1970-01-01
          • 2018-03-19
          • 2016-03-12
          • 2012-09-13
          相关资源
          最近更新 更多