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

Posted

技术标签:

【中文标题】如何在 PHP 中比较两个日期?【英文标题】:How can I compare two dates in PHP? 【发布时间】:2011-04-20 08:24:21 【问题描述】:

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

2011-10-2

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

我试过了,

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

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

但它实际上并不是这样工作的。还有什么办法?

【问题讨论】:

将数据库日期分配给 DateTime 对象,然后比较这些对象。你可以在***.com/questions/961074/… 中找到一个很好的例子 【参考方案1】:

如果您的所有日期都晚于 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 上从来都不是问题。 现在不是“如果您的所有日期都晚于 1970 年 1 月 1 日”和“早于 2038 年”吗?观看我们的 y2k38 错误。 strtotime 对于较大的日期将返回 false。 ***.com/questions/2012589/… 请注意,DateTime 方法是首选方法。该对象可以做的远远超过strtotime new DateTime('now') 也可以检索今天的日期 @Breith 就用new DateTime(),也是一样的。此外,在用户输入错误的情况下,构造函数可能会抛出异常,因此请确保已处理。【参考方案2】:

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

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

【讨论】:

但是如果它们看起来像这样,2011-10-02 和 2012-02-10,月份比较 1 > 0,但是 2011-10-02 @Davo,比较在第一个不同的字符处停止。在这种情况下,'1'的第四位数字 下面的工作2016-03-27 11:59:47 ::: 2016-03-14 10:30:00吗?【参考方案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 感谢您的评论,我更改了大写字母以消除可能的混淆。【参考方案4】:

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

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

【讨论】:

谢谢,但我实际上使用 date() 我不将今天的日期存储在数据库中 但是您将 expireDate 存储在数据库中。将此日期与 NOW() 进行比较【参考方案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;

【讨论】:

问题是要求比较 2 个日期 - 您的答案是添加大量额外的东西(即设置在线/离线状态),这对于问题的答案是不必要的。进行比较的答案部分与现有答案here 几乎相同。 更新了问题,我在错误的问题中发布了错误的答案 ^^ ;) 这与答案不一样,只是添加了我对如何比较它们并在几分钟内得到差异的输入。 由于您的更新,我已经删除了我的反对票,现在看起来好多了:)【参考方案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; 

【讨论】:

答案中应该解释为什么这种技术有效。 请回答 OP 发布的问题,而不是您如何解决自己的独特场景。【参考方案9】:

这是我关于如何使用 PHP 获得两个日期之间的天数差异的说明。 注意使用“!”感谢DateTime createFromFormat without 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";

【讨论】:

【参考方案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 提供的示例数据。 这并不完全是这家伙在寻求帮助,但我认为如果理解这些原则,这种方式会有所帮助。 我了解原理,但这段代码没有回答所提出的问题。这个页面已经被不正确和不相关的答案填满了——这只会让研究人员感到困惑并浪费他们的时间。我正在努力寻找研究人员。 嗯,我认为这并不难,他可以使用 DateTime() 类而不是 date() 函数。我上面给出的答案是为了给研究人员一些想法。 我将停止重复自己并退出这个讨论。第二高的解决方案 (***.com/a/3847762/2943403) 展示了一种非常简单(无与伦比)的创建两个日期时间对象的方法。我完全不知道你神奇的requestDate() 方法是做什么的——任何地方都没有提到它。我不会使用您的答案,也不建议任何研究人员使用您的解决方案。我不认为自己会改变我的投票。【参考方案11】:

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

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

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

【讨论】:

这似乎解决了另一个问题。请只回答 OP 提出的问题。【参考方案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-201620-02-2016的日期,比较为字符串0 以下证明您的技术无法正确比较 OP 的日期与今天的日期:3v4l.org/SNHKT OP 有不同的日期格式。 日期看起来像2011-10-2【参考方案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;

    如果($今天

希望对你有帮助

【讨论】:

这个答案没有尝试解决原始问题。 OP 对小时、分钟或秒不感兴趣。

以上是关于如何在 PHP 中比较两个日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中比较两个字符串日期?

如何使用php在两个日期之间生成随机日期?

Java中如何比较 String型 日期 ??

在 Rails 中,如何编写一个带有“where”的查找器来比较两个日期?

如何在php/codeigniter或mysql中获得两个相差20分钟的日期的所有组合

如何使用 PHP 计算两个日期之间的差异?