【问题标题】:How to convert utc timestamp to current time of another city?如何将UTC时间戳转换为另一个城市的当前时间?
【发布时间】:2019-12-04 05:10:54
【问题描述】:

我从天气 api 获得了纽约的时间戳 UTC,想要显示纽约的当前时间,但它给出的输出类似于“UTC Sun Dec 01 2019 05:00:00 GMT+0530 (India Standard Time)”。 参考代码见

  // Code 1
  //I get timestamp_utc when console.log(data)
  //timestamp_utc: "2019-12-01T05:00:00"
  const utc = new Date(data.timestamp_utc)

  console.log('UTC', utc)
  // UTC Sun Dec 01 2019 05:00:00 GMT+0530 (India Standard Time)


  // Code 2
  // Another code for getting current time but, failed
var usaTime = new Date().toLocaleString("en-US", {timeZone: timezone}); // Here timezone is from props

console.log('USA time: '+usaTime) // USA time: 12/1/2019, 4:59:58 AM

我也有从天气 API 获取的时区数据。我的目标是根据时区或 utc 时间戳获取当前时间。正如你所看到的,我的两次试验都没有成功。预计输出时间为下午 6:39,现在是纽约的当前时间。有什么好的解决办法吗?

【问题讨论】:

    标签: javascript datetime timezone


    【解决方案1】:

    让我从您的“代码 2”开始。这和你写的一样,但是填写了时区...

    const timezone = "America/New_York";
    const usaTime = new Date().toLocaleString( "en-US", { timeZone: timezone});
    console.log( 'usaTime =', usaTime );
    

    对我来说这是可行的。我得到了适用于美国的正确格式的纽约当前时间。我不确定你的为什么不起作用,但我想知道你为时区字符串指定了什么。

    我也对您的“代码 1”有些困惑。您创建的 'new Date()' 正在转换为字符串,然后由您的 console.log 语句打印,但这应该会产生一个 ISO 8601 字符串,并且您似乎得到了一个语言环境字符串(日期格式)。

    【讨论】:

      【解决方案2】:

      虽然您提供的示例字符串采用 ISO 8601 格式,但它不是明确的 UTC,因为它不以 Z 结尾,也不以 +00:00 等时区偏移量结尾。因此,当您使用Date 构造函数解析它时,它会被解释为本地时间。您可以通过自己添加Z 来解决此问题(假设timestamp_utc 字段始终是该格式的字符串):

      // timestamp_utc: "2019-12-01T05:00:00"
      const utc = new Date(data.timestamp_utc + 'Z');  // adding the Z forces parsing as UTC
      

      现在你有一个Date 对象。但是,如果您只是将其传递给console.log,您看到的输出取决于实现。您将看到与调用toString 获得的格式相同的本地时间,或者您将看到与调用toISOString 获得的相同格式的UTC 时间。

      要获取不同时区的时间,现在您可以调用toLocaleString 并传递timeZone 选项。这假定时区是有效的 IANA 时区标识符,并且代码运行的环境完全支持 ECMAScript 国际化规范 (ECMA-402) 的时区功能。大多数现代浏览器确实是这种情况,但在 Internet Explorer 等旧版浏览器中您将无法获得正确的输出。

      const usEasternTime = utc.toLocaleString("en-US", {timeZone: 'America/New_York'});
      

      最后从你的变量名usaTime,我想你可能会假设美国有一个时区,但事实并非如此。您将需要传递正确的时区标识符。见the list on Wikipedia

      【讨论】:

        【解决方案3】:

        定义起始时区($ sourceDate)和目的地(要转换)。

        $sourceTimeZone = 'utc';
        $targetTimeZone = 'America/Bogota';
        

        将格式为“m / d / y h:m:s”的原始日期的组成部分分开。

        list($month, $day, $year, $hours, $minutes, $seconds) = sscanf($sourceDate, "%d/%d/%d %d:%d:%f");
        

        构建指示其所在日期和时区的 DateTime 对象。

        $datetime = new DateTime("{$year}-{$month}-{$day} {$hours}:{$minutes}:{$seconds}",
                                 new DateTimeZone($sourceTimeZone));
        

        修改DateTime的时区为目标时区。

        $datetime -> setTimezone(new DateTimeZone($targetTimeZone));
        

        用修改的时区获取新日期的组成部分。

        list($month2, $day2, $year2, $hours2, $minutes2, $seconds2) = sscanf($datetime -> format(‘m/d/Y H:i:s’), “%d/%d/%d %d:%d:%f”);
        

        显示日期。

        echo "En {$sourceTimeZone}: {$day}/{$month}/{$year} {$hours}:{$minutes}:{$seconds}<br/>";
        echo "En {$targetTimeZone}: {$day2}/{$month2}/{$year2} {$hours2}:{$minutes2}:{$seconds2}<br/>";
        

        PD:对于 JavaScript,这可以帮助你 Convert time to different timezone with jQuery

        【讨论】:

        • 这是在 JavaScript 中吗?
        • 不,它的 php。需要在js中吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        • 2016-06-11
        • 1970-01-01
        • 1970-01-01
        • 2019-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多