如何在PHP中比较两个日期?


125

如何在PHP中比较两个日期?

日期以以下格式存储在数据库中

2011-10-2

如果我想将今天的日期与数据库中的日期进行比较,看哪个更大,我该怎么做?

我试过了

$today = date("Y-m-d");
$expire = $row->expireDate //from db

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

但这并不是真的那样。还有另一种方法吗?


将数据库日期分配给DateTime对象,然后比较这些对象。您可以在stackoverflow.com/questions/961074/…中
彼得

Answers:


80

在数据库中日期看起来像这样2011-10-2

将其存储在YYYY-MM-DD中,然后进行字符串比较,因为'1'>'0'等。


2
但是,如果它们看起来像是这样,2011-10-02和2012-02-10,用于月份比较1> 0,但是2011-10-02 <2012-02-10
dav

14
@Davo,比较在不同的第一个字符处停止。在这种情况下,'1'<'2'的第四位,因此您将获得预期的结果。
马修,

1
很抱歉:),没有足够小心。
dav

以下工作有效2016-03-27 11:59:47 ::: 2016-03-14 10:30:00吗?
shorif2000

221

如果您所有的日期都在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 */ }

或类似的东西。


如果我没记错的话,这种担心1st of January of 1970只适用于Windows上运行的旧版本的PHP,而在Unix上从来就不是问题。
阿尔瓦罗·冈萨雷斯

我喜欢这个答案。将日期转换为strtotime()是一个不错的选择
ErichGarcía17年

2
现在不是“如果您的所有日期都在1970年1月1日之后”还是“在2038年之前”吗?注意我们的y2k38错误。strtotime对于较大的日期将返回false。stackoverflow.com/questions/2012589/…–
blamb

注意,该DateTime方法是首选方法。该对象可以做的比strtotime以往任何时候都多。
Machavity

new DateTime('now')还可以检索今天的日期
Breith

23

只是为了补充已经给出的答案,请参见以下示例:

$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 2015年

2
@spdionis感谢您的评论,我更改了大写字母以消除可能的混乱。
d.raev '16

6

我不会用PHP做到这一点。数据库应该知道今天是星期几(例如,使用MySQL-> NOW()),因此在查询中进行比较并返回结果将非常容易,而不会因使用的日期类型而引起任何问题

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

谢谢,但我实际上使用date()我不将今天的日期存储在数据库中
SarmenB。2010年

4
但是您将expireDate存储在数据库中。比较一下最新与NOW()
Dr.Molle

4
$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

这是关于如何在几分钟内获得两个日期之间差异的一种方法。

// 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
由于您的更新,我删除了我的
下注,

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

0

我也有这个问题,可以通过以下方法解决:

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

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

答案中应解释这种技术为何起作用。
mickmackusa

请回答OP所发布的问题,而不是您如何解决自己的独特情况。
mickmackusa

0

这是我如何使用PHP获得两个日期之间的天数差异的自旋。注意使用“!” 格式要舍弃日期的时间部分,这要归功于DateTime createFromFormat的信息,而没有time

$today = DateTime::createFromFormat('!Y-m-d', date('Y-m-d'));
$wanted = DateTime::createFromFormat('!d-m-Y', $row["WANTED_DELIVERY_DATE"]);
$diff = $today->diff($wanted);
$days = $diff->days;
if (($diff->invert) != 0) $days = -1 * $days;
$overdue = (($days < 0) ? true : false);
print "<!-- (".(($days > 0) ? '+' : '').($days).") -->\n";

-1

在博客上找到答案,方法很简单:

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

然后您将获得两个日期之间的日期。


这似乎正在解决另一个问题。请仅回答OP提出的问题。
mickmackusa

-1

由于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的日期和今天的日期:3v4l.org/SNHKT
mickmackusa

OP具有不同的日期格式。 日期看起来像2011-10-2
mickmackusa

-1

如果您希望某个日期($ date)在某个时间间隔内到期,例如在执行密码重置时令牌到期日期,则可以执行以下操作:

$date = $row->expireDate;

$date->add(new DateInterval('PT24H')); // adds 24 hours

$now = new \DateTime();

if($now < $date) { /* expired after 24 hours */ }

但是,您可以按照以下方式进行比较:

$today = new DateTime('Y-m-d');

$date = $row->expireDate;

if($today < $date) { /* do something */ }

该答案忽略了最初发布的问题。请使用OP提供的示例数据。
mickmackusa

这不是那个家伙在寻求帮助的确切内容,但我认为,如果人们了解这些原则,这种方式可能会有所帮助。
faye.babacar78

我了解这些原则,但是此代码无法回答所提出的问题。该页面已经充满了不正确且无关的答案-这只会使研究人员感到困惑,并浪费他们的时间。我正在寻找研究人员。
mickmackusa

好吧,我认为这并不困难,他可以使用DateTime()类代替date()函数。我在上面给出的答案是以某种方式向研究人员提供了想法。
faye.babacar78

1
我将停止重复自己的讨论,并停止进行此讨论。第二高的解决方案(stackoverflow.com/a/3847762/2943403)显示了创建两个日期时间对象的非常简单(无与伦比)的方法。我完全不知道您的神奇requestDate()方法会做什么-到处都没有提及它。我不会使用您的答案,也不会建议任何研究人员使用您的解决方案。我不希望自己改变我的投票。
mickmackusa

-2

首先,尝试将所需的格式赋予服务器的当前日期时间:

  1. 获取当前日期时间

    $ current_date = getdate();

  2. 根据需要单独管理日期和时间:

$ current_date_only = $ current_date [year] .'-'。$ current_date [mon] .'-'。$ current_date [mday]; $ current_time_only = $ current_date ['hours']。':'。$ current_date ['minutes']。':'。$ current_date ['seconds'];

  1. 根据您在数据库中使用捐赠日期还是日期时间进行比较:

    $ today = $ current_date_only。” '。$ current_time_only;

    要么

    $ today = $ current_date_only;

    if($ today <$ expireDate)

希望能帮助到你


该答案未尝试解决原始问题。OP对小时,分钟或秒没有兴趣。
mickmackusa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.