82

我从 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!";  
}
4

14 回答 14

198

编辑:使用<=or>=来计算今天的日期。

这是您的代码的正确答案。只需使用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!";  
}
于 2013-09-28T18:30:40.480 回答
35

您无法比较日期字符串。改用 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!";  
}
于 2013-09-28T18:22:03.560 回答
18

如果时间很重要:

$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!";  
}    
于 2014-01-22T15:06:58.990 回答
7

基于卢特肯的回答。以为我会添加我的扭曲:)

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!";
于 2015-10-25T18:19:10.880 回答
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');

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

于 2013-09-28T18:12:55.087 回答
5

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

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

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

它始终适用于一年中的每一天,并且不依赖于任何函数或转换(PHP 将考虑 int 值与and$paymentDate的 int 值进行比较)。contractBegincontractEnd

于 2016-05-10T20:23:53.427 回答
1

如果您需要括号日期是动态的..

$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";  
}
于 2018-09-12T16:07:11.723 回答
1

简单的解决方案:

function betweenDates($cmpDate,$startDate,$endDate){ 
   return (date($cmpDate) > date($startDate)) && (date($cmpDate) < date($endDate));
}
于 2019-04-01T09:28:35.907 回答
1

您可以使用 mktime(hour, minute, seconds, month, day, year) 函数

$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!";  
}
于 2020-06-11T23:03:58.093 回答
0

直接使用

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

然后比较就可以了,因为您的 01-01-2015 对 PHP 的 32 位日期范围有效,如 strtotime 的手册中所述。

于 2013-09-28T18:24:28.093 回答
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
}

它不适用于任何其他日期格式,但适用于该格式。无需转换为秒,也无需日期功能。

于 2019-01-21T18:09:36.567 回答
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 AMto的值12:00 AM将转换为 24 小时格式。这个小技巧帮助了我。

于 2019-03-27T05:15:38.070 回答
0

因为我很懒:

$paymentDate = new DateTime();
$contractStartDate = new Datetime('01/01/2001');
$contractEndDate = new Datetime('01/01/2015');
$payable = $paymentDate < $contractEndDate && $contractStartDate > $paymentDate; //bool

var_dump($payable)

展示:

bool(false)

作为一个函数

function isPayable(DateTime $payDate, DateTime $startDate, DateTime $endDate):bool 
{
    return $payDate > $startDate && $payDate < $endDate;
}

var_dump(isPayable(new DateTime(), new Datetime('01/01/2001'), new DateTime('01/01/2015')));
var_dump(isPayable(new DateTime('2003-03-15'), new Datetime('2001-01-01'), new DateTime('2015-03-01')));



展示:

bool(false)
bool(True)
于 2022-02-02T16:02:04.537 回答
-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);
于 2019-11-15T11:24:03.830 回答