我正在连接到一个以 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/