查找两个日期之间的天数


615

如何使用PHP查找两个日期之间的天数?



5
一个班轮:(new DateTime("2010-01-11"))->diff(new DateTime("2019-08-19"))->days;
billynoah

@billynoah-这是最干净,更简单的答案!
rolinger

Answers:


906
$now = time(); // or your date as well
$your_date = strtotime("2010-01-31");
$datediff = $now - $your_date;

echo round($datediff / (60 * 60 * 24));

38
我认为返回负数天会提供相关信息。$your_date-$now如果您希望将来的日期返回正整数,则应该使用。
蒂姆(Tim)

23
leap秒呢?并非所有的日子都精确地是24 * 60 * 60秒。该代码可能足以满足实际目的,但在某些极为罕见的极端情况下并不完全正确。
本杰明·布里兹

49
忘了leap秒(不,实际上也要考虑),但这不能解释夏令时的改变!每年在这些边界上可能整天关闭。您需要使用DateTime类。
李维

6
@billynoah对不起,我再也没有回来更新我的评论。您必须注意夏令时。如果您将日期与夏令时再次比较没有日期的日期,而不是例如返回7天,则返回6.9天。发言返回6而不是7
亚历克斯·安吉利科

4
strtotime()不仅会在20年后失败,而且现在无法使用。OP指定的是日期,而不是时间。日期可能很旧。这是一个简单的答案:$ NumberDays = gregoriantojd($ EndM,$ EndD,$ EndY)-gregoriantojd($ StartM,$ StartD,$ StartY); (包括一个范围)。与日期时间类不同,格里高利语到朱利安语在v4版本中可用。有效范围是4714 BC至9999 AD。请注意时髦的参数顺序(例如您需要php的警告)。
Guy Gordon

521

如果您使用PHP 5.3 >,则这是到目前为止计算差异的最准确方法:

$earlier = new DateTime("2010-07-06");
$later = new DateTime("2010-07-09");

$diff = $later->diff($earlier)->format("%a");

14
请注意,由于我们所讨论的是时间间隔,而不是特定的时间点,因此格式语法不同于date()和strftime()语法。时间间隔语法可以在这里找到:php.net/manual/en/dateinterval.format.php
Andrew

1
或者在我的情况下,天数之间是$ date2-> diff($ date1)-> format(“%a”)-1
xeo

13
请记住,如果您的日期中有时间,这将无法正常工作。举例来说,如果你有23:30的间隔......他们是在不同的日子,将差额为0
Layke

19
如果您需要相对天数($date1早于$date2,则为负数),请$diff = $date2->diff($date1)->format("%r%a");改用。
Socce

1
?中的日期格式是DateTime("2010-07-06")什么,Y-m-d还是Y-d-m?,DateTime参数的格式是什么。哪一天?
151291 '16

165

从PHP版本5.3起,已添加新的日期/时间函数以实现不同:

$datetime1 = new DateTime("2010-06-20");

$datetime2 = new DateTime("2011-06-22");

$difference = $datetime1->diff($datetime2);

echo 'Difference: '.$difference->y.' years, ' 
                   .$difference->m.' months, ' 
                   .$difference->d.' days';

print_r($difference);

结果如下:

Difference: 1 years, 0 months, 2 days

DateInterval Object
(
    [y] => 1
    [m] => 0
    [d] => 2
    [h] => 0
    [i] => 0
    [s] => 0
    [invert] => 0
    [days] => 367
)

希望能帮助到你 !


8
是的,这似乎比公认的答案好,但在某些情况下不起作用。像:$ from ='2014-03-01'; $ to ='2014-03-31';
MBozic

1
我同意,很容易遵循并且效果很好!!!只是不要忘记使用date_default_timezone_set()函数,否则它会根据UTC时间给您带来奇怪的结果。
zeckdude 2015年

2
此功能在1980年至2020
。– LSerni

128

将您的日期转换为Unix时间戳,然后再减去一个。这将为您提供以秒为单位的差,您可以将其除以86400(一天中的秒数),以得出该范围内的近似天数。

如果您的日期格式25.1.201001/25/2010或者2010-01-25,你可以使用strtotime函数:

$start = strtotime('2010-01-25');
$end = strtotime('2010-02-20');

$days_between = ceil(abs($end - $start) / 86400);

使用ceil将天数舍入到下一个整天。floor如果要获取两个日期之间的整天数,请改用。

如果您的日期已经是unix时间戳格式,则可以跳过转换过程,而只需执行$days_between部分操作。对于更奇特的日期格式,您可能必须执行一些自定义解析才能正确处理。


9
DST呢?
toon81

3
@ toon81-我们使用Unix时间戳来避免此类混乱!;)
Alastair

6
让我详细说明一下:假设今天早上3点,几乎整个欧洲的时钟都推迟了一个小时。这意味着今天还有3600秒,应该在UNIX时间戳中反映出来。如果是这样,则意味着今天将使用上述计算天数的方式计算两天。而且我什至还没有开始飞跃,因为PHP和UNIX似乎都没有考虑到这些问题(IMO实际上是可以理解的)。TL; DR:并非每天都有86,400秒长
toon81 2013年

2
@ toon81该日期还没有3600秒。往返于DST时,UNIX时间戳什么都没有发生。
nickdnk

1
如果UNIX时间戳没有发生任何变化,那么您同意我的看法:1 pm上$day的UNIX时间戳与1 pm上的UNIX时间戳之间的差异在$day+1观察DST的时区中并不总是86400秒。可能需要23或25小时的秒数,而不是24小时。
toon81 2015年

111

TL; DR不能使用UNIX时间戳。不要使用time()。如果这样做,请做好准备以其98.0825%的可靠性使您失望。使用DateTime(或Carbon)。

正确的答案是Saksham古普塔(其他答案也是正确的)给出的:

$date1 = new DateTime('2010-07-06');
$date2 = new DateTime('2010-07-09');
$days  = $date2->diff($date1)->format('%a');

或按程序作为一线执行:

/**
 * Number of days between two dates.
 *
 * @param date $dt1    First date
 * @param date $dt2    Second date
 * @return int
 */
function daysBetween($dt1, $dt2) {
    return date_diff(
        date_create($dt2),  
        date_create($dt1)
    )->format('%a');
}

需要注意的是:“%a”似乎表示绝对天数。如果您希望它是一个有符号整数,即当第二个日期在第一个日期之前为负数,则需要使用'%r'前缀(即format('%r%a'))。


如果您确实必须使用UNIX时间戳,请将时区设置为GMT,以避免出现下面详述的大多数陷阱。


长答案:为什么除以24 * 60 * 60(又称86400)是不安全的

大多数使用UNIX时间戳(和86400将其转换为几天)的答案都是基于两个假设,这些假设合在一起会导致结果错误细微错误的场景,这些错误可能难以跟踪,甚至在几天,几周或几个月后出现成功的部署。不是说解决方案不起作用-它起作用。今天。但是明天可能会停止工作。

第一个错误是没有考虑以下问题:如果被问到“从昨天开始过去了多少天?”,如果从现在到“昨天”所指示的瞬间之间的时间少于一整天,计算机可能会如实回答

通常,在将“ day”转换为UNIX时间戳时,所获得的是该特定日期午夜的时间戳。

因此,在10月1日至10月15日的午夜之间,已经过去了15天。但是,在10月1日13:00至10月15日14:55之间,经过了15天减去5分钟,并且大多数使用floor()或进行隐式整数转换的解决方案都将比预期的少一天的时间报告

那么,“ Ymd H:i:s是多少天前”?会产生错误的答案

第二个错误是一天等于86400秒。这几乎总是正确的-它经常发生,足以忽略它没有发生的时间。但是,如果夏令时开始发挥作用,那么连续两个午夜之间以秒为单位的距离肯定不是一年至少两次至少有86400。比较DST边界上的两个日期将得出错误的答案。

因此,即使您使用将所有日期时间戳都强制设置为固定小时的“技巧”,也可以说午夜(当您仅指定日-月-年而不是小时-分-秒时,各种语言和框架也暗含了此操作;与MySQL等数据库中的DATE类型相同),广泛使用的公式

 (unix_timestamp(DATE2) - unix_timestamp(DATE1)) / 86400

要么

 floor(time() - strtotime($somedate)) / 86400

当DATE1和DATE2位于一年中的同一DST时,将返回17。但它可能返回17.042,更糟糕的是返回16.958。然后,使用floor()或任何隐式截断到整数将把本来应该为17的值转换为16。在其他情况下,true即使“ $ days> 17”之类的表达式将返回17.042,即使这表示经过的天数是18。

由于此类代码无法跨平台移植,因此事情变得更加丑陋,因为其中一些可能会应用leap秒,而某些可能不会。在那些平台上,两个日期之间的差异不会是86400,但86401,或也许86399.所以代码,5月份的工作,实际上通过了所有测试将打破明年六月时12.99999天被认为12天,而不是13两个日期在2015年有效的产品在2017年将无法使用- 相同的日期,而且任何一年都不是a年。但是在2018年3月1日至2017年3月1日之间,在那些需要维护的平台上,将经过366天而不是365天,这使2018年成为leap年(不是这样)。

因此,如果您真的想使用UNIX时间戳记:

  • round()明智地使用函数,而不是floor()

  • 或者,不要计算D1-M1-YYY1和D2-M2-YYY2之间的差。这些日期将被视为D1-M1-YYY1 00:00:00和D2-M2-YYY2 00:00:00。而是在D1-M1-YYY1 22:30:00和D2-M2-YYY2 04:30:00之间转换。您将始终获得约二十小时的剩余时间。这可能变成21个小时或19个小时,也许是18个小时,五十九分钟,三十六秒。不管。这是一个很大的利润,它将在可预见的未来保持在那里并保持乐观。现在,您可以floor()安全地截断它。

正确的解决方案,虽然,以避免魔术常量,舍入组装机和维修债务,是

  • 使用时间库(Datetime,Carbon等);不要自己动手

  • 使用真正邪恶的日期选择来编写全面的测试用例 -跨越DST边界,跨越leap年,跨越,秒等等,以及普通的日期。理想情况下(调用datetime的速度很快!),通过按顺序从字符串中组装日期来生成整个四年(和一天)的日期,并确保第一天与被测试日之间的差值稳定增加一倍。这样可以确保,如果低级例程中发生任何更改,并且leap秒修复程序都造成了严重破坏,至少您会知道的

  • 定期与其余测试套件一起运行这些测试。这只是几毫秒,可能会为您节省数小时的头部刮擦。


无论您采用哪种解决方案,都请对其进行测试!

funcdiff下面的功能在现实世界中实现了一种解决方案(碰巧是公认的解决方案)。

<?php
$tz         = 'Europe/Rome';
$yearFrom   = 1980;
$yearTo     = 2020;
$verbose    = false;

function funcdiff($date2, $date1) {
    $now        = strtotime($date2);
    $your_date  = strtotime($date1);
    $datediff   = $now - $your_date;
    return floor($datediff / (60 * 60 * 24));
}
########################################

date_default_timezone_set($tz);
$failures   = 0;
$tests      = 0;

$dom = array ( 0, 31, 28, 31, 30,
                  31, 30, 31, 31,
                  30, 31, 30, 31 );
(array_sum($dom) === 365) || die("Thirty days hath September...");
$last   = array();
for ($year = $yearFrom; $year < $yearTo; $year++) {
    $dom[2] = 28;
    // Apply leap year rules.
    if ($year % 4 === 0)   { $dom[2] = 29; }
    if ($year % 100 === 0) { $dom[2] = 28; }
    if ($year % 400 === 0) { $dom[2] = 29; }
    for ($month = 1; $month <= 12; $month ++) {
        for ($day = 1; $day <= $dom[$month]; $day++) {
            $date = sprintf("%04d-%02d-%02d", $year, $month, $day);
            if (count($last) === 7) {
                $tests ++;
                $diff = funcdiff($date, $test = array_shift($last));
                if ((double)$diff !== (double)7) {
                    $failures ++;
                    if ($verbose) {
                        print "There seem to be {$diff} days between {$date} and {$test}\n";
                    }
                }
            }
            $last[] = $date;
        }
    }
}

print "This function failed {$failures} of its {$tests} tests between {$yearFrom} and {$yearTo}.\n";

结果是

This function failed 280 of its 14603 tests

恐怖故事:“节省时间”的代价

这实际上是几个月前发生的。一位聪明的程序员决定通过在多个位置插入臭名昭著的“(MidnightOfDateB-MidnightOfDateA)/ 86400”代码,将计算最多最多花费三十秒的时间节省几微秒。这个优化是如此明显,以至于他甚至都没有记载它,并且该优化通过了集成测试,并潜伏在代码中几个月了,所有这些都没有引起注意。

这发生在一个程序中,该程序计算了几位最畅销的销售人员的工资,其中最起码的销售人员的影响力要比一支五人的程序员团队低得多。几个月前的某天,由于无关紧要的原因,漏洞爆发了- 这些家伙中的一些人整整一天都是丰厚的佣金。他们绝对不会逗乐。

无限更糟的是,他们失去了(已经非常小)的信心,他们已经在程序被设计为暗中轴他们,假装-并获得 -测试用例完整,详细的代码审查跑去通俗地说评论(加了很多接下来几周的红地毯治疗)。

我能说什么:从好的方面来说,我们摆脱了很多技术债务,并且能够重写和重构意大利面条烂摊子的一些碎片,这些碎片在90年代摇摆不定的COBOL流行。该程序现在无疑运行得更好,并且有许多调试信息可以在出现任何问题时快速归零。我估计,在可预见的未来,仅此最后一件事每月就可以节省一个或两个工作日。

不利的一面是,整个骚动给公司带来了200,000欧元的前期费用-加上面子,无疑还有一定的讨价还价能力(因此还有更多的钱)。

负责“优化”的那个人一年前在灾难发生前就换了工作,但仍然有人在提起诉讼,要求他赔偿损失。上层人士认为这是“最后一个人的错”并不能很好地解决-看起来像是我们清理问题的装置,最后,我们仍然在狗窝里而其中一个团队正计划退出。

在一百九十九次中,“ 86400 hack”将正常工作。(例如,在PHP中,strtotime()将忽略DST,并报告在十月的最后一个星期六的下一个午夜与下一个星期一的下一个午夜之间,恰好经过了2 * 24 * 60 * 60秒,即使这显然不是真的 ...而两个错误会很乐意纠正一个错误)。

女士们,先生们,这不是一个例子。与安全气囊和安全带一样,您可能永远不会真正需要DateTimeor 的复杂性(和易用性)Carbon。但是,可能的那一天(或者必须证明这一点的那一天)会像黑夜里的小偷一样来。做好准备


7
当我看到这些答案时,我以为我很愚蠢和疯狂,因为我一直使用DateTime,但是您让我明白使用DateTime是正确的方法。谢谢
Syncro

嘿,这里的每个人都在Google days between two days in php或类似网站上搜索,只是因为生命太短而无法自己编写所有内容。
Denis Matafonov


1
有时候,我希望我们能喜欢答案而不是问题。
克莱门特·培根尼尔(ClémentBaconnier)


16

面向对象的样式:

$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');

程序风格:

$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$interval = date_diff($datetime1, $datetime2);
echo $interval->format('%R%a days');

11

用这个:)

$days = (strtotime($endDate) - strtotime($startDate)) / (60 * 60 * 24);
print $days;

现在可以了


14
上面的评论很旧,但这是不正确的。StackOverflow 确实允许您回答自己的问题(即使您提出问题)。在有人已经发布了相同的解决方案之后自己回答问题被认为是不礼貌的。
Maarten Bodewes,2014年

此功能在1980年至2020
。– Lserni

10

好吧,所选答案不是最正确的答案,因为它将在UTC之外失败。根据时区(列表),可能会进行时间调整,从而创建“无” 24小时的天数,这将使计算(60 * 60 * 24)失败。

这是一个例子:

date_default_timezone_set('europe/lisbon');
$time1 = strtotime('2016-03-27');
$time2 = strtotime('2016-03-29');
echo floor( ($time2-$time1) /(60*60*24));
 ^-- the output will be **1**

因此正确的解决方案将使用DateTime

date_default_timezone_set('europe/lisbon');
$date1 = new DateTime("2016-03-27");
$date2 = new DateTime("2016-03-29");

echo $date2->diff($date1)->format("%a");
 ^-- the output will be **2**

7

计算两个日期之间的差:

$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");

$diff=date_diff($date1,$date2);

echo $diff->format("%R%a days");

产出:+272天

date_diff()函数返回两个DateTime对象之间的差。


6
$start = '2013-09-08';
$end = '2013-09-15';
$diff = (strtotime($end)- strtotime($start))/24/3600; 
echo $diff;

此功能在1980年至2020
。– Lserni '17

6

为此,我正在作曲家项目中使用Carbon

就像这样简单:

$dt = Carbon::parse('2010-01-01');
echo $dt->diffInDays(Carbon::now());

5

您可以通过以下方式轻松找到日期

<?php
$start  = date_create('1988-08-10');
$end    = date_create(); // Current time and date
$diff   = date_diff( $start, $end );

echo 'The difference is ';
echo  $diff->y . ' years, ';
echo  $diff->m . ' months, ';
echo  $diff->d . ' days, ';
echo  $diff->h . ' hours, ';
echo  $diff->i . ' minutes, ';
echo  $diff->s . ' seconds';
// Output: The difference is 28 years, 5 months, 19 days, 20 hours, 34 minutes, 36 seconds

echo 'The difference in days : ' . $diff->days;
// Output: The difference in days : 10398

4
$datediff = floor(strtotime($date1)/(60*60*24)) - floor(strtotime($date2)/(60*60*24));

并且,如果需要:

$datediff=abs($datediff);

3

如果您具有以秒为单位的时间(IE unix时间戳),则可以简单地减去时间并除以86400(每天的秒数)


3

PHP中两个日期之间的天数

      function dateDiff($date1, $date2)  //days find function
        { 
            $diff = strtotime($date2) - strtotime($date1); 
            return abs(round($diff / 86400)); 
        } 
       //start day
       $date1 = "11-10-2018";        
       // end day
       $date2 = "31-10-2018";    
       // call the days find fun store to variable 
       $dateDiff = dateDiff($date1, $date2); 

       echo "Difference between two dates: ". $dateDiff . " Days "; 

1
伟大的工作就像魅力一样,您能告诉我86400 num是干什么用的吗?
Parth Shah

86400号用于1天= 24小时和一天24 * 60 * 60 = 86400秒
mallikarjun SK

3

您可以尝试以下代码:

$dt1 = strtotime("2019-12-12"); //Enter your first date
$dt2 = strtotime("12-12-2020"); //Enter your second date
echo abs(($dt1 - $dt2) / (60 * 60 * 24));

2
对于具有现有答案的较旧问题,解释您的答案给问题带来了哪些新方面很有用。如果相关,确认自提出问题以来可能发生的任何更改也很有用。
詹森·艾勒

2
function howManyDays($startDate,$endDate) {

    $date1  = strtotime($startDate." 0:00:00");
    $date2  = strtotime($endDate." 23:59:59");
    $res    =  (int)(($date2-$date1)/86400);        

return $res;
} 

此功能在1980年至2020
。– Lserni

2

如果您想回显开始日期和结束日期之间的所有日期,我想出了以下方法:

$startdatum = $_POST['start']; // starting date
$einddatum = $_POST['eind']; // end date

$now = strtotime($startdatum);
$your_date = strtotime($einddatum);
$datediff = $your_date - $now;
$number = floor($datediff/(60*60*24));

for($i=0;$i <= $number; $i++)
{
    echo date('d-m-Y' ,strtotime("+".$i." day"))."<br>";
}

2

查找两个日期之间的天差的最简单方法

$date1 = strtotime("2019-05-25"); 
$date2 = strtotime("2010-06-23");

$date_difference = $date2 - $date1;

$result =  round( $date_difference / (60 * 60 * 24) );

echo $result;

1
    // Change this to the day in the future
$day = 15;

// Change this to the month in the future
$month = 11;

// Change this to the year in the future
$year = 2012;

// $days is the number of days between now and the date in the future
$days = (int)((mktime (0,0,0,$month,$day,$year) - time(void))/86400);

echo "There are $days days until $day/$month/$year";

1

这是我的改进版本,如果第二个参数通过,则显示1年2个月25天。

class App_Sandbox_String_Util {
    /**
     * Usage: App_Sandbox_String_Util::getDateDiff();
     * @param int $your_date timestamp
     * @param bool $hr human readable. e.g. 1 year(s) 2 day(s)
     * @see http://stackoverflow.com/questions/2040560/finding-the-number-of-days-between-two-dates
     * @see http://qSandbox.com
     */
    static public function getDateDiff($your_date, $hr = 0) {
        $now = time(); // or your date as well
        $datediff = $now - $your_date;
        $days = floor( $datediff / ( 3600 * 24 ) );

        $label = '';

        if ($hr) {
            if ($days >= 365) { // over a year
                $years = floor($days / 365);
                $label .= $years . ' Year(s)';
                $days -= 365 * $years;
            }

            if ($days) {
                $months = floor( $days / 30 );
                $label .= ' ' . $months . ' Month(s)';
                $days -= 30 * $months;
            }

            if ($days) {
                $label .= ' ' . $days . ' day(s)';
            }
        } else {
            $label = $days;
        }

        return $label;
    }
}

1
$early_start_date = date2sql($_POST['early_leave_date']);


$date = new DateTime($early_start_date);
$date->modify('+1 day');


$date_a = new DateTime($early_start_date . ' ' . $_POST['start_hr'] . ':' . $_POST['start_mm']);
$date_b = new DateTime($date->format('Y-m-d') . ' ' . $_POST['end_hr'] . ':' . $_POST['end_mm']);

$interval = date_diff($date_a, $date_b);


$time = $interval->format('%h:%i');
$parsed = date_parse($time);
$seconds = $parsed['hour'] * 3600 + $parsed['minute'] * 60;
//        display_error($seconds);

$second3 = $employee_information['shift'] * 60 * 60;

if ($second3 < $seconds)
    display_error(_('Leave time can not be greater than shift time.Please try again........'));
    set_focus('start_hr');
    set_focus('end_hr');
    return FALSE;
}

1
<?php
$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
echo $diff->format("%R%a days");
?>

上面的代码使用起来非常简单。谢谢。


1
function get_daydiff($end_date,$today)
{
    if($today=='')
    {
        $today=date('Y-m-d');
    }
    $str = floor(strtotime($end_date)/(60*60*24)) - floor(strtotime($today)/(60*60*24));
    return $str;
}
$d1 = "2018-12-31";
$d2 = "2018-06-06";
echo get_daydiff($d1, $d2);

1

使用这个简单的功能。声明功能

<?php
function dateDiff($firstDate,$secondDate){
    $firstDate = strtotime($firstDate);
    $secondDate = strtotime($secondDate);

    $datediff = $firstDate - $secondDate;
    $output = round($datediff / (60 * 60 * 24));
    return $output;
}
?>

并在需要的地方调用此函数

<?php
    echo dateDiff("2018-01-01","2018-12-31");    

// OR

    $firstDate = "2018-01-01";
    $secondDate = "2018-01-01";
    echo dateDiff($firstDate,$secondDate);    
?>

1
$diff = strtotime('2019-11-25') - strtotime('2019-11-10');
echo abs(round($diff / 86400));

2
欢迎来到SO!当您仅用代码回复帖子时,请解释一下。您带来的代码计算时间为2019-11-10至2019-11-25。因此,它没有回答这个问题。这就是为什么更好地解释您的POV而不是被低估的原因。
DavidGarcíaBodego,

0

如果您使用的是MySql

function daysSince($date, $date2){
$q = "SELECT DATEDIFF('$date','$date2') AS days;";
$result = execQ($q);
$row = mysql_fetch_array($result,MYSQL_BOTH);
return ($row[0]);

}

function execQ($q){
$result = mysql_query( $q);
if(!$result){echo ('Database error execQ' . mysql_error());echo $q;}    
return $result;

}


0

尝试使用Carbon

$d1 = \Carbon\Carbon::now()->subDays(92);
$d2 = \Carbon\Carbon::now()->subDays(10);
$days_btw = $d1->diffInDays($d2);

你也可以用

\Carbon\Carbon::parse('')

使用给定的时间戳字符串创建一个Carbon日期对象。


你能告诉我这和我的答案有什么区别吗?
2015年

1
要进行简单的日期更改,您建议包括一个全新的包装吗?
tomazahlin

0

寻找所有答案我编写了通用函数,适用于所有PHP版本。

if(!function_exists('date_between')) :
    function date_between($date_start, $date_end)
    {
        if(!$date_start || !$date_end) return 0;

        if( class_exists('DateTime') )
        {
            $date_start = new DateTime( $date_start );
            $date_end   = new DateTime( $date_end );
            return $date_end->diff($date_start)->format('%a');
        }
        else
        {           
            return abs( round( ( strtotime($date_start) - strtotime($date_end) ) / 86400 ) );
        }
    }
endif;

通常,我使用“ DateTime”来查找两个日期之间的日期。但是,如果由于某种原因,某些服务器设置未启用“ DateTime”,它将使用带有“ strtotime()”的简单(但不安全)计算。

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.