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


69

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

1
如果您使用php5,请在no2.php.net/manual/en/datetime.diff.php
汤姆

您真的要使用date()或strtotime()吗?
马克·贝克

我使用strtotime时仍然收到“ No Go!”;
2013年

然后,您应该阅读strtotime()接受的格式。...但是date()绝对是使用错误的函数
Mark Ba​​ker

为什么是-1?这似乎是一个好问题。我放置了代码,并得到了很好的注释。我认为这可能对其他人有帮助。
2013年

Answers:


177

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

这是您的代码的正确答案。只需使用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年

6
@PapaDeBeau:您必须记住,01/01/2001此解决方案中的日期是m/d/Y格式,而不是d/m/Y
2013年

5
我不会使用严格的比较,所以这是最好的$ paymentDate> = $ contractDateBegin和$ paymentDate <= $ contractDateEnd
pollux1er 2014年

if((($ paymentDate> $ contractDateBegin)&&($ paymentDate <$ contractDateBegin))可以是if((($ paymentDate> = $ contractDateBegin)&&($ paymentDate <= $ contractDateEnd))这样它可以检查大于等于小于等于。
Kamesh Jungi 2015年

2
如果您提供的日期早于Unix纪元,则此解决方案以及此页面上的所有其他解决方案都会失败。尝试1942/07/28,看看会发生什么。
Alex Barker

32

您无法比较日期字符串。改用PHPDateTime对象是个好习惯:

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

同样,它一定是php5问题。我想我需要用Godaddy更新它。我收到此错误:致命错误:调用未定义的方法DateTime :: getTimestamp()
爸爸

您正在使用哪个PHP版本?
luttkens 2013年

@PapaDeBeau:在低于5的PHP版本中不可用。<?php echo phpversion(); ?>输出什么?
阿马尔·穆拉利

1
看起来getTimestamp()仅在5.3上受支持...但是它于2009年发布:)
luttkens 2013年

1
如果$paymentDate->getTimestamp() and $contractDateEnd->getTimestamp()在$ contractDateEnd与当前日期相同时打印,将产生错误的结果。例如,今天是01/05/2015,但如果您更改$ contractDateEnd = new DateTime('2015-05-01'); 则会产生错误的时间戳。而不是仅仅$paymentDate = new DateTime();应该使用$paymentDate = new DateTime('2015-05-01') ie。将当前日期传递给它
RN库什瓦哈,

17

如果时间很重要:

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

5

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

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');

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


我一定不能使用php5吗?我收到此错误:调用未定义的函数date_create_from_format()
爸爸

试试吧date_create
Ofir Baruch

2
@PapaDeBeau:date_create_from_formatPHP 5.3中引入了该功能,该功能已经寿终正寝,但您使用的甚至是更早的版本。我建议升级的今天,如果可能的。
2013年

@OfirBaruch:无法使用,因为d/m/Y不是受支持的格式之一
2013年

Downvoter:这个答案有问题吗?请通过发表评论来帮助我改进它。
2013年

3

另一个解决方案是考虑将日期写为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将考虑$paymentDatein的值与contractBeginand的in值进行比较contractEnd)。


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";  
}

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

0

直接使用

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

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


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
}

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


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 AM12:00 AM会被转换为24小时格式。这个小把戏帮助了我。


0

简单的解决方案:

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

你能解释一下这个用法吗?
因格斯

-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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.