如何保留ISO8601格式的字符串中的时区信息?

时间:2015-01-28 02:03:38

标签: php datetime timezone iso8601

我使用ISO8601格式从不同时区的设备获取时间戳记的日志文件。过滤此类文件以获取某些值(包括时间戳),我可以随时间绘制某些指标。问题是时间戳更改为运行脚本的服务器的时区,而不是日志文件中指定的时区。

这是我正在做的一个例子:

$d = new DateTime();
$d->format('c');
$d->setTimestamp(strtotime("2015-01-19T10:20:24-0500"));
$tz = $d->getTimezone();
echo $tz->getName()."<br/>";
echo $d->format(DateTime::ISO8601)."<br/>";

如果我在澳大利亚托管的服务器上运行此脚本,则输出显示:

Australia/Melbourne
2015-01-20T02:20:24+1100

而不是GMT-5,时间以GMT + 11显示。知道如何从日志文件中保留时区吗?

谢谢。

3 个答案:

答案 0 :(得分:1)

文档中已报告此问题:http://php.net/manual/en/datetime.format.php#114366

尝试:

<?php
$d = new ...
$d->setTimezone( $d->getTimeZone() );
echo $d->format(DateTime::ISO8601)."<br/>";
?>

参考文献:

http://php.net/manual/en/datetime.gettimezone.php

答案 1 :(得分:1)

再次感谢,@ pyb!由于之前的时区信息不可用,我根据您的建议修改了DateTime::createFromFormat ()。这是我做的:

$d = date_create_from_format ( "Y-m-d\TH:i:se" , "2015-01-19T10:20:24-0500" );
echo $d->format(DateTime::ISO8601)."<br/>";

现在,我看到了我想要的输出:

2015-01-19T10:20:24-0500

答案 2 :(得分:0)

在此处找到:http://www.pontikis.net/tip/?id=29

function date_convert($dt, $tz1, $df1, $tz2, $df2) {
  // create DateTime object
  $d = DateTime::createFromFormat($df1, $dt, new DateTimeZone($tz1));
  // convert timezone
  $d->setTimeZone(new DateTimeZone($tz2));
  // convert dateformat
  return $d->format($df2);
}

实例 将欧洲/雅典的datetime 28/10/2013 02:00:00转换为UTC timastamp:

date_convert('28/10/2013 02:00:00', 'Europe/Athens', 'd/m/Y H:i:s', 'UTC', 'YmdHis');