通过 > 和 < operators

问题描述 投票:0回答:6

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

有什么方法可以使大于和小于运算符的日期比较失败?

        $curdate=date('Y-m-d H:i:s');
        if($start_datetime>$curdate)
php datetime comparison timezone
6个回答
7
投票

不。
他们没有办法失败。
Mysql 日期格式就是为了这个目的而特意制作的。

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


3
投票

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);

0
投票

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

时间戳比较会更快,但我不认为在 php 应用程序中需要在性能上进行如此微小的改进,而且您还必须考虑 2030 bug。


0
投票

我更喜欢比较“自 Unix 纪元(1970 年 1 月 1 日 00:00:00 GMT)以来的秒数”。当然,这只适用于 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
}

0
投票
strtotime($curdate) < strtotime($start_datetime)

strtotime() 返回一个 int 代表自 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 大 1。


0
投票

有什么方法可以使大于和小于运算符的日期比较失败?

如果您确定日期字符串的格式正确,则不需要。但我们来谈谈这个吧。我只是错误地在 Edge 的日期 INPUT 元素中输入了五位数的年份,它允许这样做,并将值“19920-01-01”发送到服务器。当作为字符串进行比较时,这样的日期与过去的日期相比是

$curdate

更糟糕的是,PHP DateTime 类无法正确解析五位数年份:

php > var_dump(new DateTime("19920-01-01 10:30:00"));
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2000-01-01 10:30:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
}

因此,您甚至不能依赖转换为 DateTime 然后进行比较。我现在拒绝来自浏览器的长度不超过十个字符的日期字符串。之后,我就可以安全地与

$curdate
进行字符串比较。

© www.soinside.com 2019 - 2024. All rights reserved.