我从不同时区的设备获取使用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 显示。知道如何从日志文件中保留时区吗?
谢谢。
文档 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
再次感谢,@pyb!由于之前没有时区信息,我根据您的建议进行了修改,使用 DateTime::createFromFormat ()
.这是我所做的:
$d = date_create_from_format ( "Y-m-dTH:i:se" , "2015-01-19T10:20:24-0500" );
echo $d->format(DateTime::ISO8601)."<br/>";
现在,我看到了我想要的输出:
2015-01-19T10:20:24-0500
在这里找到: 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);
}
例子将日期时间 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');