将当前日期与没有零填充的Y-m-d字符串进行比较。

159
如何在PHP中比较两个日期?
日期以以下格式存储在数据库中:
2011-10-2
如果我想要比较今天的日期和数据库中的日期,以确定哪个日期更大,我该如何做?
我尝试了以下方法,
$today = date("Y-m-d");
$expire = $row->expireDate //from db

if($today < $expireDate) { //do something; }

但事实并非如此。还有其他的方法吗?

将数据库日期分配给一个DateTime对象,然后比较这些对象。您可以在https://dev59.com/JHNA5IYBdhLWcg3wcNbF找到一个很好的例子。 - Peter
13个回答

259
如果您所有日期都晚于1970年1月1日,您可以使用以下代码:
$today = date("Y-m-d");
$expire = $row->expireDate; //from database

$today_time = strtotime($today);
$expire_time = strtotime($expire);

if ($expire_time < $today_time) { /* do Something */ }

如果你使用的是 PHP 5 >= 5.2.0 版本,你可以使用 DateTime 类:

$today_dt = new DateTime($today);
$expire_dt = new DateTime($expire);

if ($expire_dt < $today_dt) { /* Do something */ }

或者类似这样的东西。


如果我没记错的话,关于“1970年1月1日”的问题只适用于在Windows上运行的旧版本PHP,并且在Unix上从未出现过这个问题。 - Álvaro González
2
现在不应该是“如果您的所有日期都晚于1970年1月1日”并且“早于2038年”吗?要注意y2k38问题。strtotime将对更大的日期返回false。 https://dev59.com/8nI-5IYBdhLWcg3wHUZB - blamb
请注意,DateTime 方法是首选方法。该对象比 strtotime 更强大。 - Machavity
2
new DateTime('now') 也可以用来获取今天的日期。 - Breith
1
@Breith 只需使用new DateTime(),它的作用相同。此外,在用户输入错误的情况下,构造函数可能会抛出异常,所以请确保已处理该异常。 - mbomb007

89
在数据库中日期的格式为 2011-10-2。 将其存储为 YYYY-MM-DD ,这样字符串比较就能够起作用,因为 '1' > '0' 等等。

3
但如果它们看起来像这样,2011-10-02和2012-02-10,对于月份比较1>0,但2011-10-02 < 2012-02-10。 - dav
17
@Davo,比较会在第一个不同的字符处停止。在这种情况下,数字“1”的第四位小于数字“2”的第四位,因此你得到了你期望的结果。 - Matthew
以下代码是否能够正常工作呢:2016-03-27 11:59:47 ::: 2016-03-14 10:30:00 - shorif2000

29

为了补充之前提供的答案,看以下示例:

$today = new DateTime('');
$expireDate = new DateTime($row->expireDate); //from database



if($today->format("Y-m-d") < $expireDate->format("Y-m-d")) { 
    //do something; 
}

更新: 或者简单使用老式的date()函数:

if(date('Y-m-d') < date('Y-m-d', strtotime($expire_date))){
    //echo not yet expired! 
}   

1
日期是一个函数,而不是一个类/构造函数。 - spdionis
4
感谢 @spdionis 的评论,我将大写字母改为避免可能的混淆。 - d.raev

10

我不会用PHP来做这件事。 一个数据库应该知道今天是几号(例如使用MySQL->NOW()),这样在查询时可以非常容易地进行比较并返回结果,而不会因为使用的日期类型而出现任何问题。

SELECT IF(expireDate < NOW(),TRUE,FALSE) as isExpired FROM tableName

谢谢,但我实际上使用date()函数,我不会将今天的日期存储在数据库中。 - Exploit
5
但是你在数据库中存储了过期日期。将这个日期与当前时间(NOW())进行比较。 - Dr.Molle

7
$today = date('Y-m-d');//Y-m-d H:i:s
$expireDate = new DateTime($row->expireDate);// From db 
$date1=date_create($today);
$date2=date_create($expireDate->format('Y-m-d'));
$diff=date_diff($date1,$date2);

//echo $timeDiff;
if($diff->days >= 30){
    echo "Expired.";
}else{
    echo "Not expired.";
}

2
你可以将日期转换为UNIX时间戳,并以秒为单位比较它们之间的差异。
$today_date=date("Y-m-d");
$entered_date=$_POST['date'];
$dateTimestamp1 = strtotime($today_date);
$dateTimestamp2 = strtotime($entered_date);
$diff= $dateTimestamp1-$dateTimestamp2;
//echo $diff;
if ($diff<=0)
   {
     echo "Enter a valid date";
   }

2

以下是如何以分钟为单位计算两个日期之间的差异的方法。

// set dates
$date_compare1= date("d-m-Y h:i:s a", strtotime($date1));
// date now
$date_compare2= date("d-m-Y h:i:s a", strtotime($date2));

// calculate the difference
$difference = strtotime($date_compare1) - strtotime($date_compare2);
$difference_in_minutes = $difference / 60;

echo $difference_in_minutes;

这个问题要求比较两个日期 - 你的回答添加了很多额外的东西(例如设置在线/离线状态),这不是问题的答案所必需的。你回答中进行比较的部分与已有的答案在这里几乎相同。 - crazyloonybin
更新了问题,我在错误的问题中发布了错误的答案 ^^ ;) 它与答案不同,只是添加了我的输入,说明如何比较它们并获得差异(分钟)。 - Syno
1
我已经取消了我的踩票,因为你的更新,现在看起来好多了 :) - crazyloonybin

0

在博客上找到了答案,它非常简单:

strtotime(date("Y"."-01-01")) -strtotime($newdate))/86400

你将会得到两个日期之间的天数。


这似乎是在解决一个不同的问题。请只回答 OP 提出的问题。 - mickmackusa

0
这个可以工作是因为PHP的字符串比较逻辑。简单地说,您可以检查...
if ($startdate < $date) {// do something} 
if ($startdate > $date) {// do something}

两个日期必须采用相同的格式。数字需要在左侧补零,并按从最高位到最低位的顺序排列。Y-m-dY-m-d H:i:s满足这些条件。


1
d-m-Y 不起作用.. Y-m-d(像2016-05-08这样带前导零的格式)可以正常工作。以字符串形式比较在 d-m-Y 格式下的日期 01-10-201620-02-2016,当 0 < 2 时它会停止比较,但是结果是不正确的... - Arxeiss
这里有证据表明你的技术将无法正确地比较OP的日期与今天的日期:https://3v4l.org/SNHKT - mickmackusa
OP有不同的日期格式。日期看起来像 2011-10-2 - mickmackusa

0

我也遇到了这个问题,我通过以下方式解决了它:

$today = date("Ymd");
$expire = str_replace('-', '', $row->expireDate); //from db

if(($today - $expire) > $NUMBER_OF_DAYS) 
{ 
    //do something; 
}

为什么这种技术有效应该在答案中得到解释。 - mickmackusa
请回答原帖中提出的问题,而不是解决您自己独特情况的方法。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接