【问题标题】:PHP: Comparing two DateTime objects with different timezonesPHP:比较具有不同时区的两个 DateTime 对象
【发布时间】:2016-01-07 05:44:03
【问题描述】:

在使用条件运算符(<>>=<=)时,PHP 如何比较 DateTime 对象?

这种比较时区是不变的吗?

我尝试了下面的代码,它看起来是时区不变的,有人可以确认吗?

代码:

$datestr = "2015-10-09 10:28:01";
$dt = new DateTime($datestr);
$nowdate = new DateTime("now",new DateTimeZone("CET"));
print_r($dt);
echo "<br/>";
print_r($nowdate);
echo "<br/>";
var_dump($nowdate<$dt);

输出:

DateTime Object ( [date] => 2015-10-09 10:28:01 [timezone_type] => 3 [timezone] => Europe/Paris ) 
DateTime Object ( [date] => 2015-10-09 10:53:42 [timezone_type] => 2 [timezone] => CET ) 
boolean false

【问题讨论】:

    标签: php datetime timezone


    【解决方案1】:

    根据the manual

    从 PHP 5.2.2 开始,可以使用比较运算符来比较 DateTime 对象。

    您选择了一个非常令人困惑的示例,其中包括一个不清楚是否应该是过去的固定日期和一个当前不活跃的时区(西欧的 CEST 直到 10 月底)。无论如何,我认为您的输出没有任何问题:2015-10-09 10:53:42 CET(等于 2015-10-09 09:53:42 UTC)明显大于 2015-10-09 10:28:01 Europe/Paris(等于 2015-10-09 08:28:01 UTC)。

    通过一个稍微好一点的例子,我们可以猜测操作数确实按预期工作:

        echo "Same date:\n";
        $a = new DateTime('2015-01-31 01:23:45 UTC');
        $b = new DateTime('2015-01-31 02:23:45 Europe/Paris');
        var_dump($a, $b, $a<$b, $a==$b, $a>$b);
        echo "\n";
    
        echo "First greater than second:\n";
        $a = new DateTime('2015-01-31 01:23:46 UTC');
        $b = new DateTime('2015-01-31 02:23:45 Europe/Paris');
        var_dump($a, $b, $a<$b, $a==$b, $a>$b);
        echo "\n";
    
        echo "First less than second:\n";
        $a = new DateTime('2015-01-31 01:23:45 UTC');
        $b = new DateTime('2015-01-31 02:23:46 Europe/Paris');
        var_dump($a, $b, $a<$b, $a==$b, $a>$b);
    
    Same date:
    [...]
    bool(false)
    bool(true)
    bool(false)
    
    First greater than second:
    [...]
    bool(false)
    bool(false)
    bool(true)
    
    First less than second:
    [...]
    bool(true)
    bool(false)
    bool(false)
    

    Demo with full code.

    另一个例子:

    $date_2014 = new DateTime('2014-12-31 23:00:00 -07:00');
    $date_2015 = new DateTime('2015-01-01 05:00:00 Asia/Tokyo');
    var_dump($date_2014<$date_2015); // bool(false)
    

    【讨论】:

    • 很好解释。谢谢@Álvaro G. Vicario
    • 我发现日期很难掌握。这就是我努力学习的原因:)
    • 我有两个不同时区的日期。并且两个日期都有时区偏移。我希望两个日期之间的差异以秒、分钟或小时为单位。
    • @YatinMistry 您可以使用网站右上角的“”按钮提问。评论框旨在就特定问题或答案发表评论。
    【解决方案2】:

    上面代码的问题是使用了不同的时区类型。

    PHP 有三种时区:

    • UTC 偏移量,例如 new DateTime("2015-02-29 -0500");

    • 时区缩写,如new DateTime("2015-02-29 EST");

    • 时区标识符,例如 new DateTime("2015-02-29 America/Montreal");

    如果你比较两个具有不同时区类型的日期时间对象,它不会给你适当的结果。

    在你的情况下,时区是类型 2 和类型 3。使用相同的时区类型,它会给你正确的结果。

    【讨论】:

    • 如果比较运算符完全起作用,那是因为有人为 DateTime 对象编写了特定的实现。在那种情况下,很难相信他忘记了三个属性中的两个;-)
    • 在我看来是同一个案例 ;-)
    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2013-10-02
    • 1970-01-01
    • 2017-08-06
    • 2016-09-15
    • 2013-06-22
    相关资源
    最近更新 更多