【问题标题】:How to retain timezone info from a string in ISO8601 format?如何从 ISO8601 格式的字符串中保留时区信息?
【发布时间】:2015-01-28 02:03:37
【问题描述】:

我从不同时区的设备获取使用 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+11,而不是 GMT-5。知道如何从日志文件中保留时区吗?

谢谢。

【问题讨论】:

    标签: php datetime timezone iso8601


    【解决方案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

    【讨论】:

    【解决方案2】:

    再次感谢@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
    

    【讨论】:

      【解决方案3】:

      在这里找到: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 时间戳:

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

      【讨论】:

        猜你喜欢
        • 2013-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        相关资源
        最近更新 更多