Adn*_*nan 876
$now = time(); // or your date as well
$your_date = strtotime("2010-01-31");
$datediff = $now - $your_date;
echo round($datediff / (60 * 60 * 24));
Run Code Online (Sandbox Code Playgroud)
小智 500
如果您正在使用PHP 5.3 >,这是迄今为止计算差异的最准确方法:
$earlier = new DateTime("2010-07-06");
$later = new DateTime("2010-07-09");
$diff = $later->diff($earlier)->format("%a");
Run Code Online (Sandbox Code Playgroud)
Adi*_*att 157
从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);
Run Code Online (Sandbox Code Playgroud)
结果如下:
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
)
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你 !
Tat*_*nen 127
将您的日期转换为unix时间戳,然后从另一个中减去一个.这将为您提供以秒为单位的差异,您可以将其除以86400(一天中的秒数),以便为您提供该范围内的大致天数.
如果您的日期是格式25.1.2010,01/25/2010或者2010-01-25,您可以使用以下strtotime功能:
$start = strtotime('2010-01-25');
$end = strtotime('2010-02-20');
$days_between = ceil(abs($end - $start) / 86400);
Run Code Online (Sandbox Code Playgroud)
使用ceil舍入到下一整天的天数.使用floor,如果你想获得这些两个日期之间的充分天量来代替.
如果您的日期已经采用unix时间戳格式,则可以跳过转换并执行该$days_between部分.对于更奇特的日期格式,您可能需要进行一些自定义解析才能使其正确.
LSe*_*rni 97
time().如果您这样做,请准备好 98.0825%的可靠性使您失败.使用DateTime(或Carbon).将正确的答案是Saksham古普塔(其他答案也是正确的)给出的:
$date1 = new DateTime('2010-07-06');
$date2 = new DateTime('2010-07-09');
$days = $date2->diff($date1)->format('%a');
Run Code Online (Sandbox Code Playgroud)
或者在程序上作为一个单行:
/**
* 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');
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是:'%a'似乎表示绝对天数.如果您希望它作为有符号整数,即当第二个日期在第一个日期之前时为负,那么您需要使用'%r'前缀(即format('%r%a')).
如果您确实必须使用UNIX时间戳,请将时区设置为GMT以避免下面详述的大部分陷阱.
大多数使用UNIX时间戳(以及86400将其转换为天数)的答案做出两个假设,这些假设放在一起会导致错误结果的场景和可能难以跟踪的细微错误,甚至在几天,几周或几个月后出现成功部署.这不是解决方案不起作用 - 它的工作原理.今天.但它明天可能会停止工作.
第一个错误是没有考虑到当被问及"从昨天过去多少天?"时,如果在当前和"昨天"指示的瞬间不到一整天之后,计算机可以如实地回答零.
通常在将"日期"转换为UNIX时间戳时,获得的是该特定日期午夜的时间戳.
因此,在10月1日至10月15日的中午之间,已经过了十五天.但是在10月1日的13:00和10月15日的14:55之间,已经过了15天减去5分钟,并且大多数使用floor()或进行隐式整数转换的解决方案将报告比预期少一天.
所以,"多少天前是Ymd H:我:"?会得出错误的答案.
第二个错误是将一天等同于86400秒.这几乎总是正确的 - 它经常发生,足以忽略它没有的时间.但是,当夏令时发挥作用时,两个连续中午之间的距离以秒为单位肯定不会是每年至少两次86400.比较DST边界的两个日期将得出错误的答案.
因此,即使您使用强制所有日期时间戳到固定小时的"黑客",比如午夜(当您仅指定日 - 月 - 年而非小时 - 分 - 秒时,这也通过各种语言和框架隐式完成;同样在数据库(如MySQL)中使用DATE类型,这是一种广泛使用的公式
(unix_timestamp(DATE2) - unix_timestamp(DATE1)) / 86400
Run Code Online (Sandbox Code Playgroud)
要么
floor(time() - strtotime($somedate)) / 86400
Run Code Online (Sandbox Code Playgroud)
当DATE1和DATE2属于同一年度的DST段时,将返回17; 但它可能会返回17.042,更糟糕的是,16.958.使用floor()或任何隐式截断到整数将转换应该是17到16.在其他情况下,像"$ days> 17"这样的表达式将返回true17.042,即使这表示已经过了一天的计数是18岁.
事情变得更加丑陋,因为这样的代码不能跨平台移植,因为有些代码可能会应用闰秒而某些代码可能不会.在那些平台上做,两个日期之间的差异不会是86400,但86401,或也许86399.所以代码,5月份的工作,实际上通过了所有测试将打破明年六月时12.99999天被认为是13.两个日期,而不是12天在2015年工作的将在2017年不起作用 - 相同的日期,并且这两年都不是闰年.但是在2018-03-01和2017-03-01之间,在那些关心的平台上,366天将过去而不是365,使2017年成为闰年.
所以,如果你真的想使用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之间进行转换.你总会得到大约二十个小时的剩余时间.这可能变成二十一小时或十九,也许十八小时,五十九分三十六秒.不管.这是一个巨大的利润,将留在那里,并在可预见的未来保持积极.现在你可以floor()安全地截断它.
在正确的解决方案,虽然,以避免魔术常量,舍入组装机和维修债务,是
使用时间库(Datetime,Carbon,等等); 不要自己动手
使用真正邪恶的日期选择编写全面的测试用例 - 跨越DST边界,跨越闰年,跨越闰秒等,以及常见日期.理想情况下(调用datetime 很快!)通过顺序组合它们来生成四个整年(和一天)的日期,并确保第一天和被测试日之间的差异稳定增加一.这将确保如果低级例程和闰秒修复中的任何更改尝试造成严重破坏,至少您会知道.
定期与测试套件的其余部分一起运行这些测试.它们只需几毫秒,可以节省数小时的头部刮伤.
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";
Run Code Online (Sandbox Code Playgroud)
结果是,
This function failed 280 of its 14603 tests
Run Code Online (Sandbox Code Playgroud)
这实际上发生在几个月前.一个聪明的程序员决定通过在几个地方插入臭名昭着的"(MidnightOfDateB-MidnightOfDateA)/ 86400"代码,最多花费大约30秒的计算来节省几微秒.这是一个非常明显的优化,他甚至没有记录它,并且优化通过了集成测试并潜伏了几个月的代码,都没有被注意到.
这发生在一个计算几个畅销销售人员的工资的计划中,其中最少的一个比一个不起眼的五人程序员团队更有影响力.几个月前的某一天,由于重要的原因,这个小虫突然袭来 - 其中一些人一整天都在减薪.他们绝对没有被逗乐.
无限更糟糕的是,他们失去了他们在程序中没有设计的秘密(已经非常少)的信念,并假装 - 并获得 - 一个完整,详细的代码审查与测试用例运行并以外行的方式评论(加上很多在接下来的几周内进行红地毯处理).
我能说什么:从好的方面来说,我们摆脱了大量的技术债务,并且能够重写和重构几个意大利面条的碎片,这些碎片在90年代的摇摆中回到了COBOL的侵扰.毫无疑问,该程序现在运行得更好,并且有更多的调试信息可以在任何看起来很可疑时快速归零.我估计,在可预见的未来,这最后一件事每月可能会节省一到两个人日.
在负面方面,整个喧嚣使公司在前面花费了大约20万欧元 - 加上面子,加上无疑具有一些议价能力(因此还有更多的钱).
负责"优化"的人在灾难发生前一年前改变了工作,但仍然有人要求起诉他要求赔偿.它与上层人员的关系并不顺利,因为它是"最后一个人的错" - 它看起来像是我们清理这件事的设置,最后,我们仍然在狗窝里其中一个团队正计划退出.
百分之九十九,"86400黑客"将完美无瑕地运作.(例如在PHP中,strtotime()将忽略DST并报告在十月的最后一个星期六和下一个星期一的中午之间,正好2*24*60*60秒已经过去,即使这显然不是真的 ......两个错误很乐意使一个人正确).
女士们,先生们,这是其中一个例子.与气囊和安全带,你也许永远不会真正需要的复杂性(和易用性)DateTime或Carbon.但是你可能会(或者你必须要证明你想到这一天的那一天)将在夜间成为一个小偷.做好准备.
小智 16
易于使用date_diff
$from=date_create(date('Y-m-d'));
$to=date_create("2013-03-15");
$diff=date_diff($to,$from);
print_r($diff);
echo $diff->format('%R%a days');
Run Code Online (Sandbox Code Playgroud)
use*_*143 16
面向对象的风格:
$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');
Run Code Online (Sandbox Code Playgroud)
程序风格:
$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$interval = date_diff($datetime1, $datetime2);
echo $interval->format('%R%a days');
Run Code Online (Sandbox Code Playgroud)
PHP*_*ari 10
用这个:)
$days = (strtotime($endDate) - strtotime($startDate)) / (60 * 60 * 24);
print $days;
Run Code Online (Sandbox Code Playgroud)
现在它有效
Mig*_*sta 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**
Run Code Online (Sandbox Code Playgroud)
所以正确的解决方案是使用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**
Run Code Online (Sandbox Code Playgroud)
小智 6
$start = '2013-09-08';
$end = '2013-09-15';
$diff = (strtotime($end)- strtotime($start))/24/3600;
echo $diff;
Run Code Online (Sandbox Code Playgroud)
为了这个和类似的目的,我在我的作曲家项目中使用Carbon.
它就像这样容易:
$dt = Carbon::parse('2010-01-01');
echo $dt->diffInDays(Carbon::now());
Run Code Online (Sandbox Code Playgroud)
您可以通过简单地找到日期
<?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
Run Code Online (Sandbox Code Playgroud)
计算两个日期之间的差:
$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
echo $diff->format("%R%a days");
Run Code Online (Sandbox Code Playgroud)
产出:+272天
date_diff()函数返回两个DateTime对象之间的差。
| 归档时间: |
|
| 查看次数: |
745683 次 |
| 最近记录: |