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

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


2011-10-2


如果我想将今天的日期与数据库中的日期进行比较,看哪个更大,我该怎么做? br />
$today = date("Y-m-d");
$expire = $row->expireDate //from db

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


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

评论

将数据库日期分配给DateTime对象,然后比较这些对象。您可以在stackoverflow.com/questions/961074/…中找到一个很好的示例。

#1 楼


数据库中的日期如下所示:2011-10-2 '等

评论


但是如果它们看起来像是2011-10-02和2012-02-10,则月份比较1> 0,但2011-10-02 <2012-02-10

–dav
13年2月22日在23:26

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

–马修
13年2月23日在2:25

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

–dav
13年2月23日在7:51



以下工作将于2016-03-27 11:59:47 ::: 2016-03-14 10:30:00吗?

–shorif2000
16 Mar 29 '16 at 11:01

#2 楼

如果所有日期都在1970年1月1日之后,则可以使用以下方法:可以使用DateTime类:

评论


如果我没记错的话,关于1970年1月1日的问题仅适用于Windows上运行的旧版本的PHP,而在Unix上从来就不是问题。

–ÁlvaroGonzález
16年1月25日在12:49

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

–埃里希·加西亚(ErichGarcía)
17年1月25日在4:30

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

–blamb
18年1月22日在21:23



请注意,DateTime方法是首选方法。该对象可以做的事比strtotime所能做的要多得多。

–Machavity♦
18年8月1日在15:12

新的DateTime('now')也可以检索今天的日期

–布赖斯
4月27日13:33

#3 楼

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

$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! 
}   


评论


日期是一个函数,而不是一个类/构造函数。

– spdionis
2015年4月6日在12:01

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

–.dev
16年1月25日在12:46

#4 楼

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

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


评论


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

–Sarmen B.
10-10-3在5:26

但是您将expireDate存储在数据库中。将此日期与NOW()比较

–莫勒博士
2010-10-3 7:53



#5 楼

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


#6 楼

这是一种以分钟为单位获取两个日期之间差异的方法。

// 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
17年12月6日在12:59



更新了问题,我在错误的问题^^中张贴了错误的答案;)与答案不同,只是添加了有关如何比较它们并在几分钟内获得差异的输入。

–锡诺
17年12月6日14:02

由于您进行了更新,因此我删除了我的下一篇投票,现在看起来好多了:)

– Crazyloonybin
17年12月6日在14:05

#7 楼

您可以将日期转换为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";
   }


#8 楼

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

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

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


评论


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

– mickmackusa
6月12日9:43

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

– mickmackusa
6月12日10:58

#9 楼

这是我关于如何使用PHP获取两个日期之间的天数差异的一个想法。
请注意使用'!'格式,以丢弃日期的时间部分,这要归功于DateTime createFromFormat的信息而没有时间。

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


#10 楼

如果您希望某个日期($ 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
6月12日10:49

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

–faye.babacar78
6月13日9:13

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

– mickmackusa
6月13日9:14



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

–faye.babacar78
6月13日9:27

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

– mickmackusa
6月13日9:55



#11 楼

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

评论


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

– mickmackusa
6月12日10:48

#12 楼

由于PHP的字符串比较逻辑,因此可以工作。只需检查即可...

if ($startdate < $date) {// do something} 
if ($startdate > $date) {// do something}


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

评论


d-m-Y不起作用。.Y-m-d(像2016-05-08那样前导零)将起作用。检查那些日期为d-m-Y格式的01-10-2016和20-02-2016,比较字符串0 <2,它将停止比较但错误地...

– Arxeiss
16-11-19在15:57



这证明您的技术将无法正确比较OP的日期和今天的日期:3v4l.org/SNHKT

– mickmackusa
6月12日10:56

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

– mickmackusa
6月12日11:07



#13 楼

首先,尝试为服务器的当前日期时间指定所需的格式:



获取当前日期时间


$ current_date = getdate();

按您希望的方式分别管理日期和时间:

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



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

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



$ today = $ current_date_only;

if($ today <$ expireDate)


希望有帮助

评论


该答案未尝试解决原始问题。 OP对小时,分钟或秒没有兴趣。

– mickmackusa
6月12日10:51