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

时间:2013-09-28 18:09:47

标签: 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!";  
}

13 个答案:

答案 0 :(得分:129)

这是您的代码的正确答案..只需使用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!";  
}

答案 1 :(得分:29)

您无法比较日期字符串。使用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!";  
}

答案 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!";  
}    

答案 3 :(得分:4)

您正在将日期作为字符串进行比较,这不起作用,因为比较是字典的。这与排序文本文件时的问题相同,其中行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');

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

答案 4 :(得分:2)

基于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!";

答案 5 :(得分:2)

另一种解决方案是将日期写为Ymd。

以这种“格式”编写,这很容易比较日期。

var covg = feed["DataItem"]["@name"].Select(f => (string)f.SelectToken("#text"));

它将始终适用于一年中的每一天,并且不依赖于任何函数或转换(PHP将考虑$paymentDate = date('Ymd'); // on 4th may 2016, would have been 20160504 $contractBegin = 20010101; $contractEnd = 20160101; echo ($paymentDate >= $contractBegin && $paymentDate <= $contractEnd) ? "Between" : "Not Between"; 的int值与$paymentDate和{{的int值进行比较1}})。

答案 6 :(得分:1)

您可以使用mktime(小时,分钟,秒,月,日,年)功能

$paymentDate = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
$contractDateBegin = mktime(0, 0, 0, 1, 1, 2001); 
$contractDateEnd =  mktime(0, 0, 0, 1, 1, 2012);

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

答案 7 :(得分:0)

直接使用

$paymentDate = strtotime(date("d-m-Y"));
$contractDateBegin = strtotime("01-01-2001");
$contractDateEnd = strtotime("01-01-2015");

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

答案 8 :(得分:0)

如果您需要将括号日期设为动态..

$todayStr = date('Y-m-d');
$todayObj=date('Y-m-d', strtotime($todayStr));
$currentYrStr =  date('Y');
$DateBegin = date('Y-m-d', strtotime("06/01/$currentYrStr"));
$DateEnd = date('Y-m-d', strtotime("10/01/$currentYrStr"));
if (($todayObj > $contractDateBegin) && ($paymentDate < $contractDateEnd)){
    $period="summer";
}else{
   $period="winter";  
}

答案 9 :(得分:0)

另一个解决方案(假设您知道日期格式始终为YYYY / MM / DD,且前导零)是max()和min()函数。我认为这是可以的,因为所有其他答案也都假定为yyyy-mm-dd格式,并且如果您想确保它们按日期顺序排序,它是文件系统中文件夹的通用命名约定。

正如其他人所说,给定数字的顺序,您可以比较字符串,而无需strtotime()函数。

示例:

$biggest = max("2018/10/01","2018/10/02");

优点是您可以在其中粘贴更多日期,而不仅仅是比较两个日期。

$biggest = max("2018/04/10","2019/12/02","2016/03/20");

要弄清楚一个日期是否在两个日期之间,您可以进行比较 min()和max()的结果

$startDate="2018/04/10";
$endDate="2018/07/24";
$check="2018/05/03";
if(max($startDate,$check)==min($endDate,$check)){
    // It's in the middle
}

它不能与其他任何日期格式一起使用,但是可以。无需转换为秒,也不需要日期功能。

答案 10 :(得分:0)

上述方法很有用,但不是完全验证的,因为如果时间在12:00 AM / PM和01:00 AM / PM之间,则会出错。尽管在该时间之间,它仍将返回“ No Go”。 这是相同的代码:

$time = '2019-03-27 12:00 PM';

$date_one = $time; 
$date_one = strtotime($date_one);
$date_one = strtotime("+60 minutes", $date_one);
$date_one =  date('Y-m-d h:i A', $date_one);

$date_ten = strtotime($time); 
$date_ten = strtotime("-12 minutes", $date_ten); 
$date_ten = date('Y-m-d h:i A', $date_ten);

$paymentDate='2019-03-27 12:45 AM';

$contractDateBegin = date('Y-m-d h:i A', strtotime($date_ten)); 
$contractDateEnd = date('Y-m-d h:i A', strtotime($date_one));

echo $paymentDate; 
echo "---------------"; 
echo $contractDateBegin; 
echo "---------------"; 
echo $contractDateEnd; 
echo "---------------";

$contractDateEnd='2019-03-27 01:45 AM';

if($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd)  
{  
 echo "is between";
} 
else
{  
  echo "NO GO!";  
}

在这里您将获得输出"NO Go",因为12:45 > 01:45

要在两者之间获得正确的输出日期,请确保将"AM"01:00 AM的{​​{1}}值转换为24小时格式。这个小把戏帮助了我。

答案 11 :(得分:0)

简单的解决方案:

function betweenDates($cmpDate,$startDate,$endDate){ 
   return (date($cmpDate) > date($startDate)) && (date($cmpDate) < date($endDate));
}

答案 12 :(得分:-1)

function get_format($df) {

    $str = '';
    $str .= ($df->invert == 1) ? ' - ' : '';
    if ($df->y > 0) {
        // years
        $str .= ($df->y > 1) ? $df->y . ' Years ' : $df->y . ' Year ';
    } if ($df->m > 0) {
        // month
        $str .= ($df->m > 1) ? $df->m . ' Months ' : $df->m . ' Month ';
    } if ($df->d > 0) {
        // days
        $str .= ($df->d > 1) ? $df->d . ' Days ' : $df->d . ' Day ';
    } 

    echo $str;
}

$yr=$year;
$dates=$dor;
$myyear='+'.$yr.' years';
$new_date = date('Y-m-d', strtotime($myyear, strtotime($dates)));
$date1 = new DateTime("$new_date");
$date2 = new DateTime("now");
$diff = $date2->diff($date1);