通过 > 比较日期且<运营商

发布于 2024-10-30 04:42:21 字数 205 浏览 0 评论 0 原文

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

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

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

All across my php code i'm storing dates and times in UTC, but i'm also using mysql to store datetimes (also in utc).

is there any way that date comparisons can fail with the greater than and less than operator?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

谁对谁错谁最难过 2024-11-06 04:42:21

不。
他们不可能失败。
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.

旧情勿念 2024-11-06 04:42:21

PHP:
使用 strtotime()UNIX 时间戳code> 然后你就可以比较了。


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:
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:

$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);
英雄似剑 2024-11-06 04:42:21

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

时间戳比较会更快,但我不认为在 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.

不回头走下去 2024-11-06 04:42:21

我更喜欢比较“自 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
}

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:

if (date("U",$date1) > date("U",$date2)) {
  // $date1 is more recent than $date2
} else {
  // $date1 is older than (or equal to) $date2
}
羞稚 2024-11-06 04:42:21
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。

strtotime($curdate) < strtotime($start_datetime)

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.

小…红帽 2024-11-06 04:42:21

是否有任何方法可以使大于和小于运算符的日期比较失败?

如果您确定日期字符串的格式正确,则不会。但我们来谈谈这个吧。我只是错误地在 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 然后进行比较。我现在拒绝来自浏览器的与正则表达式 ^\d{4}-\d{2}-\d{2}$ 不匹配的日期字符串。之后,我就可以安全地与 $curdate 进行字符串比较。

is there any way that date comparisons can fail with the greater than and less than operator?

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:

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"
}

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文