PHP:将 ISO8601 偏移量转换为实际时区

标签 php datetime

我正在连接到一个以 ISO8601 格式返回计划信息的 JSON 事件 API。

"schedule": [
{
    "datetime": "2014-06-02T19:30:00-04:00",
    "speaker": "Keith Moore"
},
{
    "datetime": "2014-06-03T19:30:00-04:00",
    "speaker": "Phyllis Moore"
]

当我 echo date("c", strtotime($schedule[$j]["datetime"])); 我得到 2014-06-02T18:30:00-05:00 .当然,这是有道理的,因为 date() 使用服务器的时区。

如果我将时区传递给 date(),或使用 date_default_timezone_set),那么它应该会解决问题。不幸的是,没有关于 ISO8610 中时区的规范(只是偏移量)。如果我尝试使用 date() 从 ISO8601 日期获取时区,则时区返回到服务器的时区。

我想要做的是显示事件本地的日期/时间/时区(在本例中为东部夏令时)。有办法做到这一点吗?

我想到了几个选项,但似乎都不合适...

由于我可以控制 API,所以我可以发送 RFC 822 格式的日程信息(2014 年 6 月 2 日星期一 19:30:00 EDT)。那会给我一些我可以做的钩子(Hook)......

if ($pubDatetimezone == "PST" || $pubDatetimezone == "PDT") date_default_timezone_set("America/Los_Angeles");
if ($pubDatetimezone == "MST" || $pubDatetimezone == "MDT") date_default_timezone_set("America/Denver");
if ($pubDatetimezone == "CST" || $pubDatetimezone == "CDT") date_default_timezone_set("America/Chicago");
if ($pubDatetimezone == "EST" || $pubDatetimezone == "EDT") date_default_timezone_set("America/Montreal");

...但 ISO8601 似乎是更合适的格式。

另一方面,我可以做一些过于复杂的数组,在其中指定每个可能的日期/偏移量组合与时区。毫无疑问,这看起来工作量太大了。

最佳答案

您应该使用 PHP 的 DateTime。由于 ISO8601 是国际标准,PHP 支持它。您需要的代码如下:

$dt = DateTime::createFromFormat(DateTime::ISO8601, '2014-06-03T19:30:00-04:00');

您可以指定第三个参数,一个 DateTimeZone 对象,您可以使用它进一步偏移给定的日期。

比如你想用GMT -4作为GMT

$dt = DateTime::createFromFormat(DateTime::ISO8601, '2014-06-03T19:30:00-04:00', new DateTimeZone('Europe/London'));

在那之后,剩下的就是:

echo $dt->format('d.m.Y, H:i:s'); // format is the same as for date() function.

关于PHP:将 ISO8601 偏移量转换为实际时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17951061/

相关文章:

PHP 从数组中删除具有空值的键值对

php - Mysql限制删除检查

c# - 将时间添加到日期时间,但排除周末,并且应该在工作时间之间

php - 如何将日期格式 yyyy-mm-dd 更改为 dd-mm-yyyy

ruby-on-rails - 如何在不同时区显示 Rails 表单日期时间选择?

sql - 如何在SQL Server中确定一个月中有多少天?

php - 表单文本字段默认在焦点上消失,用户输入保留在表单更正上

php base64解码函数无法解码base64图像字符串

php - 使行不同并且重复行值总计

java - 如何将日期对象的长值转换为日期