【问题标题】:How to deal with Date and Timezone in PHP with AWS API如何使用 AWS API 处理 PHP 中的日期和时区
【发布时间】:2013-04-23 20:53:50
【问题描述】:

我正在使用 AWS PHP 开发工具包,亚马逊的 API 在下面返回此时间戳。

2013-04-23T13:18:00Z

他们给我的时间戳似乎已经在我的时区。由于它没有指定它是哪个时区,我想它被假定为我的当地时间。 ISO 8601 的 wiki 站点还声明...

如果没有给出带有时间表示的 UTC 关系信息,则假定时间为本地时间。

但是当我尝试在像this 这样的 PHP 中使用它时,它会将它转换为我的本地时区。 PHP 的 strtotime 页面这样说...

此函数的每个参数都使用默认时区,除非在该参数中指定了时区。

我的问题是,如果 strtotime 已经在我的时区中,为什么要将它转换为我的时区?

【问题讨论】:

    标签: php amazon-web-services


    【解决方案1】:

    亚马逊返回的日期末尾的“Z”表示它是 UTC。您将需要转换时区以使其本地化。您可以通过执行以下操作来做到这一点:

    <?php
    
    $date = new DateTime('2013-04-23T13:18:00Z'); // Z = UTC
    echo $date->format('H') . PHP_EOL;
    //> 13
    $date->setTimezone(new DateTimeZone('America/Los_Angeles')); // -0700
    echo $date->format('H') . PHP_EOL;
    //> 06
    

    更新:阅读所有 cmets 以获得完整的解决方案。

    【讨论】:

    • 根据 wiki for ISO 8601,亚马逊给出的这个时间已经是我的当地时间了。Time zones in ISO 8601 are represented as local time (with the location unspecified), as UTC, or as an offset from UTC. 所以当我尝试转换它时,它会将它转换为错误的时间,因为它已经在正确的时间。
    • 亚马逊是否提供了错误的格式?还是 PHP 在它不应该转换的时候转换它?
    • 您在问题中包含的日期正确提供了时区。时区为 UTC +0000。 Z 表示“零”或 +0000。这在 ISO 8601 中有效。除非您的时区是 UTC +0000,否则您需要对其进行转换。
    • Jeremy...我认为问题可能出在亚马逊他们传回的日期上。我从 CloudWatch 客户端调用 getMetricStatistics,开始日期为 2013-04-24T09:31:00-06:00,结束日期为 2013-04-24T10:31:00-06:00(只是最后一小时的数据)。这些是它回馈给我的一些日期... 2013-04-24T10:26:00Z, 2013-04-24T10:01:00Z, 2013-04-24T10:21:00Z, 2013-04-24T10: 06:00Z。就好像 API 正在传回我的当地时间,但时区为 Z 或零或 zulu 或 +00:00。你看到了吗?
    • 啊,我明白你的意思了。介意分享您与 SDK 一起使用的代码吗?我可以更轻松地了解代码的外观。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2013-08-29
    • 2017-03-10
    • 2015-11-14
    • 1970-01-01
    相关资源
    最近更新 更多