通过 > 比较日期且<运营商
在我的 php 代码中,我以 UTC 格式存储日期和时间,但我也使用 mysql 来存储日期时间(也是以 UTC 格式)。
有什么方法可以使大于和小于运算符的日期比较失败?
$curdate=date('Y-m-d H:i:s');
if($start_datetime>$curdate)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
不。
他们不可能失败。
Mysql 的日期格式就是为了这个目的而特意制定的。
没有任何理由将其转换为任何其他格式进行比较。
Nope.
There is no way for them to fail.
Mysql date format is intentionally made for this purpose.
There is not a single reason to convert it in whatever else format to compare.
PHP:
使用
strtotime()UNIX 时间戳code>
然后你就可以比较了。
MySQL:
将日期列的dataType更改为
DateTime
然后你可以通过以下方式进行比较:PHP:
change date into UNIX timestamp using
strtotime()
and then u can compare.MySQL:
change dataType of date column to
DateTime
and then u can compare below way:直接日期时间比较不会失败。你可以这么做。
时间戳比较会更快,但我不认为在 php 应用程序中需要在性能上进行如此微小的改进,而且您还必须考虑 2030 bug。
A direct datetime compare won't fail. You can do that.
A timestamp comparison would be faster, but I don't think such a micro-improvement in performance would be something to look for in a php application, plus you'll have to take into account the 2030 bug.
我更喜欢比较“自 Unix 纪元(1970 年 1 月 1 日 00:00:00 GMT)以来的秒数”。当然,这仅适用于 1970 年/之后的日期。
鉴于 $date1 和 $date2 是两个要比较的日期变量:
I prefer to compare the 'Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)'. Of course, this is only good for dates on/after 1970.
Given that $date1 and $date2 are two date variables to compare:
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。
strtotime() returns a int rperesenting the Seconds that passed since 01.01.1970
That means if $curdate date is "2011-01-01 12:00:00" and $start-datetime is "2011-01-01 12:00:01" then $start-datetime is bigger then $curdate because strtotime returns an integer for $start-datetime that is exactly one bigger than $curdate.
如果您确定日期字符串的格式正确,则不会。但我们来谈谈这个吧。我只是错误地在 Edge 的日期 INPUT 元素中输入了五位数的年份,它允许这样做,并将值“19920-01-01”发送到服务器。当作为字符串进行比较时,类似的日期与过去的
$curdate
进行比较。更糟糕的是,PHP DateTime 类无法正确解析五位数年份:
因此,您甚至不能依赖转换为 DateTime 然后进行比较。我现在拒绝来自浏览器的与正则表达式
^\d{4}-\d{2}-\d{2}$
不匹配的日期字符串。之后,我就可以安全地与$curdate
进行字符串比较。Not if you're sure the date string is properly formatted. But let's talk about that. I just mistakenly typed a five-digit year in a date INPUT element in Edge and it allowed it, sending the value "19920-01-01" to the server. A date like that compares as in the past to
$curdate
when comparing as a string.To make matters worse, the PHP DateTime class doesn't correctly parse a five digit year:
So, you can't even rely on converting to DateTime and then doing your comparison. I now reject date strings coming from the browser that don't match the regular expression
^\d{4}-\d{2}-\d{2}$
. After that, I can then safely do a string comparison to$curdate
.