PHP检查两个日期之间的日期

Pap*_*eau 54 php date

我从Stackoverflow获取此代码并稍微更改它以适应今天的日期.

我想检查今天是否适合两个日期.但这不起作用.我错过了什么?

$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!";  
}
Run Code Online (Sandbox Code Playgroud)

小智 141

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

$paymentDate = date('Y-m-d');
$paymentDate=date('Y-m-d', strtotime($paymentDate));
//echo $paymentDate; // echos today! 
$contractDateBegin = date('Y-m-d', strtotime("01/01/2001"));
$contractDateEnd = date('Y-m-d', strtotime("01/01/2012"));

if (($paymentDate >= $contractDateBegin) && ($paymentDate <= $contractDateEnd)){
    echo "is between";
}else{
    echo "NO GO!";  
}
Run Code Online (Sandbox Code Playgroud)

  • 我不会使用严格的比较,所以这是最好的$ paymentDate> = $ contractDateBegin和$ paymentDate <= $ contractDateEnd (5认同)
  • @PapaDeBeau:你必须记住,这个解决方案中的那些`01/01/2001`日期是`m/d/Y`格式,而不是'd/m/Y`. (4认同)
  • 当您提供在 unix 纪元之前开始的日期时,此解决方案以及此页面上的所有其他解决方案都会失败。用 1942/07/28 试试看会发生什么。 (3认同)

lut*_*ens 31

您无法比较日期字符串.改为使用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!";  
}
Run Code Online (Sandbox Code Playgroud)

  • 如果当 $contractDateEnd 与当前日期相同时打印 `$ paymentDate-&gt;getTimestamp() 和 $contractDateEnd-&gt;getTimestamp()` ,则会产生错误的结果。例如今天是 01/05/2015 但如果您更改 $contractDateEnd = new DateTime('2015-05-01'); 那么它会产生错误的时间戳。您应该使用“$ paymentDate = new DateTime('2015-05-01')”,而不仅仅是“$ paymentDate = new DateTime();”。将当前日期传递给它 (2认同)

小智 14

如果时间重要:

$paymentDate = strtotime(date("Y-m-d 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!";  
}    
Run Code Online (Sandbox Code Playgroud)


Vig*_*jis 7

基于 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!";
Run Code Online (Sandbox Code Playgroud)


Jon*_*Jon 5

您将日期作为字符串进行比较,这是行不通的,因为比较是按字典顺序进行的。这与对文本文件进行排序时的问题相同,其中一行20会出现在一行之后100,因为内容不被视为数字,而是被视为 ASCII 代码序列。此外,创建的日期都是错误的,因为您使用的是字符串格式字符串,其中需要时间戳(第二个参数)。

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

 $paymentDate = date_create();
 $contractDateBegin = date_create_from_format('d/m/Y', '01/01/2001');
 $contractDateEnd = date_create_from_format('d/m/Y', '01/01/2015');
Run Code Online (Sandbox Code Playgroud)

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

  • @PapaDeBeau:`date_create_from_format` 是在 PHP 5.3 中引入的,它[已经达到生命周期的终点](http://php.net/archive/2013.php#id2013-07-11-1)——但你正在使用甚至更早的版本。如果可能的话,我建议*今天*升级。 (2认同)