如何将utc时间戳转换为另一个城市的当前时间?

时间:2019-11-30 23:43:39

标签: javascript datetime timezone

我从天气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

我也有从Weather API获取的时区数据。我的目标是根据时区或utc时间戳获取当前时间。如您所见,我的两个尝试均未成功。预期输出是下午6:39,现在是纽约时间。有什么好的解决办法吗?

3 个答案:

答案 0 :(得分:0)

让我从您的“代码2”开始。这与您编写的内容相同,但时区已填写...

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

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

我也对您的“代码1”感到困惑。您创建的'new Date()'将转换为字符串,然后由console.log语句打印,但这将导致ISO 8601字符串,并且您似乎正在获取语言环境字符串(日期格式)。

答案 1 :(得分:0)

尽管您给出的示例字符串为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

答案 2 :(得分:-1)

定义起点($ 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