在我的 php 代码中,我以 UTC 格式存储日期和时间,但我也使用 mysql 来存储日期时间(也是以 utc 格式)。
有什么方法可以使大于和小于运算符的日期比较失败?
$curdate=date('Y-m-d H:i:s');
if($start_datetime>$curdate)
不。
他们没有办法失败。
Mysql 日期格式就是为了这个目的而特意制作的。
没有任何理由将其转换为任何其他格式进行比较。
直接日期时间比较不会失败。你可以这么做。
时间戳比较会更快,但我不认为在 php 应用程序中需要在性能上进行如此微小的改进,而且您还必须考虑 2030 bug。
我更喜欢比较“自 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
}
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。
有什么方法可以使大于和小于运算符的日期比较失败?
如果您确定日期字符串的格式正确,则不需要。但我们来谈谈这个吧。我只是错误地在 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
进行字符串比较。