【问题标题】:Incorrect timezone and timestamp with PHP Datetime objects and strtotimePHP Datetime 对象和 strtotime 的时区和时间戳不正确
【发布时间】:2020-11-21 03:45:33
【问题描述】:

我的服务器时区是 UTC, 但是当我创建一个 DateTime 对象或当我使用 strtotime 将日期转换为时间戳时,结果是错误的。

我做了一个简单的代码:

$date_init = '2020-07-25 13:00:00';
$dt = new DateTime( $date_init, new DateTimeZone( 'UTC' ) );

$timezone = date_default_timezone_get();
$strtotime = strtotime( $date_init . ' UTC' );
$timestamp = $dt->getTimestamp();
$date_final = $dt->format( 'Y-m-d H:i:s P e' );

当我回显这些值时:

$date_init = 2020-07-25 13:00:00
$timezone = UTC
$strtotime = 1595700000
$timestamp = 1595700000
$date_final = 2020-07-25 13:00:00 -05:00 UTC

即使时间戳是错误的(1595700000 = 2020-07-25 18:00:00 UTC)(online converter)。

预期结果是:

$timestamp = 1595682000
$strtotime = 1595682000
$date_final = 2020-07-25 13:00:00 +00:00 UTC

我不明白发生了什么,有人可以帮忙吗?

PHP 版本:7.3.19

【问题讨论】:

    标签: php datetime timestamp timezone offset


    【解决方案1】:

    在创建 DateTime 对象时提供时区作为第二个参数。

    $date_init = '2020-07-25 13:00:00';
    $dt = new DateTime( $date_init , new DateTimeZone("UTC"));
    
    echo $dt->format('Y-m-d H:i:s P e');
    

    【讨论】:

    • 相同的结果 :( 2020-07-25 13:00:00 -05:00 UTC
    • 看起来date( 'Y-m-d H:i:s P e', $timestamp ) 创建了一个新的日期对象并忽略了设置的时区。你可以改用DateTime::format,我更新了我的答案。
    • 不幸的是,与 DateTime::format 的结果相同(2020-07-25 13:00:00 -05:00 UTC)。谢谢你帮忙。我认为最基本的问题是 strtotime('2020-07-25 13:00:00 UTC') = 1595700000 而不是 1595682000。我猜问题来自服务器或 PHP 配置,但我不知道是哪个一。 (它在我的本地开发网站上运行良好)。
    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多