PHP检查两个date之间的date

我从Stackoverflow得到了这个代码,并稍微改变了它与今天的date一起工作。

我想检查,如果今天适合两个date之间。 但是这不起作用。 我错过了什么?

$paymentDate = date('d/m/Y'); echo $paymentDate; // echos today! $contractDateBegin = date('d/m/Y', '01/01/2001'); $contractDateEnd = date('d/m/Y', '01/01/2015'); if ($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd) { echo "is between"; } else { echo "NO GO!"; } 

这是你的代码的正确答案..只需使用strtotime() PHP函数

  $paymentDate = date('Ym-d'); $paymentDate=date('Ym-d', strtotime($paymentDate));; //echo $paymentDate; // echos today! $contractDateBegin = date('Ym-d', strtotime("01/01/2001")); $contractDateEnd = date('Ym-d', strtotime("01/01/2012")); if (($paymentDate > $contractDateBegin) && ($paymentDate < $contractDateEnd)) { echo "is between"; } else { echo "NO GO!"; } 

你不能比较datestring。 使用PHP的DateTime对象是很好的习惯:

 $paymentDate = new DateTime(); // Today echo $paymentDate->format('d/m/Y'); // echos today! $contractDateBegin = new DateTime('2001-01-01'); $contractDateEnd = new DateTime('2015-01-01'); if ( $paymentDate->getTimestamp() > $contractDateBegin->getTimestamp() && $paymentDate->getTimestamp() < $contractDateEnd->getTimestamp()){ echo "is between"; }else{ echo "NO GO!"; } 

如果小时重要:

 $paymentDate = strtotime(date("Ymd H:i:s")); $contractDateBegin = strtotime("2014-01-22 12:42:00"); $contractDateEnd = strtotime("2014-01-22 12:50:00"); if($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd) { echo "is between"; } else { echo "NO GO!"; } 

您将比较date作为string,这是行不通的,因为比较是字典。 这与sorting文本文件时的问题是一样的,在文本文件中行20会出现在行100因为内容不被视为数字,而是被视为ASCII码的序列。 另外,创build的date都是错误的,因为您使用的是期望时间戳的string格式string(第二个参数)。

相反,您应该比较DateTime对象的时间戳,例如:

  $paymentDate = date_create(); $contractDateBegin = date_create_from_format('01/01/2001', 'd/m/Y'); $contractDateEnd = date_create_from_format('01/01/2015', 'd/m/Y'); 

您现有的条件将正常工作。

直接使用

 $paymentDate = strtotime(date("dmY")); $contractDateBegin = strtotime("01-01-2001"); $contractDateEnd = strtotime("01-01-2015"); 

然后比较就可以了,因为你的01-01-2015对于PHP的32位date范围是有效的,在strtotime的手册里有说明。

根据luttken的回答。 以为我会添加我的扭曲:)

 function dateIsInBetween(\DateTime $from, \DateTime $to, \DateTime $subject) { return $subject->getTimestamp() > $from->getTimestamp() && $subject->getTimestamp() < $to->getTimestamp() ? true : false; } $paymentDate = new \DateTime('now'); $contractDateBegin = new \DateTime('01/01/2001'); $contractDateEnd = new \DateTime('01/01/2016'); echo dateIsInBetween($contractDateBegin, $contractDateEnd, $paymentDate) ? "is between" : "NO GO!"; 

另一个解决办法就是把date写成Ymd。

写在这个“格式”这是很容易比较date。

 $paymentDate = date('Ymd'); // on 4th may 2016, would have been 20160504 $contractBegin = 20010101; $contractEnd = 20160101; echo ($paymentDate >= $contractBegin && $paymentDate <= $contractEnd) ? "Between" : "Not Between"; 

它将一直工作于一年中的每一天,而不依赖于任何函数或转换(PHP会考虑$paymentDate的int值与contractBegincontractEnd的int值进行比较)。