如何在PHP中正确地将时间戳转换为ISO 8601?

时间:2017-01-27 04:30:37

标签: php

我从http://www.unixtimestamp.com/index.php

获取时间戳

因此,对于2016/1/1 @ 1:1:1,时间戳应为1451610061,相当于2016-01-01T01:01:01+00:00中的ISO 8601(来自网站),但是当我运行下面的代码时,我会得到相反,2016-01-01T02:01:01+01:00的输出。我错过了什么吗?

$ts = 1451610061;
echo date('c', $ts);

1 个答案:

答案 0 :(得分:1)

这显然是一个时区问题,可以从" +00:00" vs" +01:00"。

您还可以通过使用date_default_timezone_set

之前设置默认时区来验证这一点
date_default_timezone_set("UTC");
  

2016-01-01T01:01:01 + 00:00

请参阅eval.in - UTC

VS

date_default_timezone_set("Europe/Berlin");
  

2016-01-01T02:01:01 + 01:00

请参阅eval.in - Berlin

您还可以使用date_default_timezone_get

了解您当地的时区
echo date_default_timezone_get();

eval.in - local timezone

  

UTC

这也解释了为什么http://eval.in显示预期输出。

当然,您可以单独在DateTime对象上设置时区

$ts = 1451610061;
$dt = new DateTime("@$ts");

$utc = new DateTimeZone("UTC");
$dt->setTimezone($utc);
echo "UTC=", $dt->format('c'), "\n";

$berlin = new DateTimeZone("Europe/Berlin");
$dt->setTimezone($berlin);
echo "Berlin=", $dt->format('c'), "\n";

这将显示

  

UTC = 2016-01-01T01:01:01 + 00:00
  柏林= 2016-01-01T02:01:01 + 01:00

eval.in - setTimezone

最后回答您的问题:您的代码没有任何问题。根据{{​​3}},2016-01-01T02:01:01+01:00是此时间戳的完美有效表示。