我正在连接到以 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"
]
Run Code Online (Sandbox Code Playgroud)
当我echo date("c", strtotime($schedule[$j]["datetime"]));收到 2014-06-02T18:30:00-05:00 时。当然,这是有道理的,因为date()使用服务器的时区。
如果我将时区传递给date(),或使用date_default_timezone_set),那么它应该可以解决问题。不幸的是,没有关于 ISO8610 中的时区的规范(只是偏移量)。如果我尝试从 ISO8601 日期获取时区,使用date(),则时区将返回到服务器的时区。
我想要做的是显示事件本地的日期/时间/时区(在本例中为东部夏令时)。有没有办法做到这一点?
我想到了几个选项,但似乎都不合适......
由于我可以控制 API,因此我可以以 RFC 822 格式(星期一,2014 年 6 月 2 日 19:30:00 EDT)发送计划信息。那会给我我可以做的钩子......
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");
Run Code Online (Sandbox Code Playgroud)
...但 ISO8601 似乎是一种更合适的格式。
另一方面,我可以做一些过于复杂的数组,在其中指定每个可能的日期/偏移量组合和时区。当然,这看起来工作量太大了。
您应该使用 PHP 的 DateTime。由于 ISO8601 是国际标准,PHP 支持它。您需要的代码如下:
$dt = DateTime::createFromFormat(DateTime::ISO8601, '2014-06-03T19:30:00-04:00');
Run Code Online (Sandbox Code Playgroud)
您可以指定第三个参数,一个 DateTimeZone 对象,您可以使用它进一步偏移给定日期。
例如,如果您想使用 GMT -4 表示 GMT
$dt = DateTime::createFromFormat(DateTime::ISO8601, '2014-06-03T19:30:00-04:00', new DateTimeZone('Europe/London'));
Run Code Online (Sandbox Code Playgroud)
在那之后,剩下的就是:
echo $dt->format('d.m.Y, H:i:s'); // format is the same as for date() function.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5495 次 |
| 最近记录: |