【问题标题】:Comparing dates via > and < operators通过 > 和 < 运算符比较日期
【发布时间】:2011-04-04 12:48:26
【问题描述】:

在我的所有 php 代码中,我都以 UTC 格式存储日期和时间,但我也使用 mysql 来存储日期时间(也在 UTC 格式)。

如果使用大于和小于运算符,日期比较是否会失败?

        $curdate=date('Y-m-d H:i:s');
        if($start_datetime>$curdate)

【问题讨论】:

    标签: php datetime comparison timezone


    【解决方案1】:

    没有。
    他们没有办法失败。
    Mysql 日期格式就是为此目的而设计的。

    没有任何理由将其转换为其他任何格式进行比较。

    【讨论】:

    • 谢谢你的弹片先生——你的答案可能是最权威的!
    【解决方案2】:

    PHP: 使用 strtotime() 将日期更改为 UNIX 时间戳,然后您可以进行比较。


    MySQL:

    将日期列的dataType更改为DateTime,然后您可以通过以下方式进行比较:

    $d1 = new DateTime('2008-08-03 14:52:10');
    $d2 = new DateTime('2008-01-03 11:11:10');
    
    var_dump($d1 == $d2);
    var_dump($d1 > $d2);
    var_dump($d1 < $d2);
    

    【讨论】:

    • 我也是。您还可以安全地比较 php 中的 Y-m-d H:i:s 日期时间 - 它们甚至不会受到 unix 时间戳的 2038 错误的影响。
    • 不需要将时间转换为日期时间。只需使用常规的“”运算符,您就可以直接比较 'Y-m-d H:i:s' 格式的日期字符串。 PHP 将按字母顺序比较字符串,在比较这种格式的时间字符串时会产生准确的结果(它也适用于 YYYY-MM-DD 日期)。
    • 关于时间戳,你可能想读这个stackoverflow.com/a/7229760/2652018
    【解决方案3】:

    直接日期时间比较不会失败。你可以这样做。

    时间戳比较会更快,但我不认为在 php 应用程序中需要寻找这样的性能微小改进,而且您必须考虑到 2030 年的错误。

    【讨论】:

      【解决方案4】:

      我更喜欢比较“自 Unix 纪元以来的秒数(格林威治标准时间 1970 年 1 月 1 日 00:00:00)”。当然,这仅适用于 1970 年或之后的日期。

      假设 $date1 和 $date2 是要比较的两个日期变量:

      if (date("U",$date1) > date("U",$date2)) {
        // $date1 is more recent than $date2
      } else {
        // $date1 is older than (or equal to) $date2
      }
      

      【讨论】:

        【解决方案5】:
        strtotime($curdate) < strtotime($start_datetime)
        

        strtotime() 返回一个表示自 1970 年 1 月 1 日以来经过的秒数的整数 这意味着如果 $curdate 日期是 "2011-01-01 12:00:00" 并且 $start-datetime 是 "2011-01-01 12:00:01" 那么 $start-datetime 大于 $curdate 因为 strtotime 返回$start-datetime 的整数,正好比 $curdate 大一。

        【讨论】:

        • 我了解 strtotime,但我不明白直接比较会在哪里失败
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-19
        • 2017-10-06
        • 2021-11-27
        相关资源
        最近更新 更多