在PHP中计算日期之间的天数差异?

96

有没有一种快速计算PHP日期差的方法?例如:

$date1 = '2009-11-12 12:09:08';
$date2 = '2009-12-01 08:20:11';

然后进行一个计算,$date2 减去 $date1

我查阅了 php.net 的文档,但没有找到解决方案。是否有一种快速的方法可以执行此操作?


@kiamlaluno - 那不是一个完全相同的副本,因为它更加复杂(那个问题中的OP想要日期格式为“x年,y月,z天”等)。 - Dominic Rodger
3个回答

209

我建议使用 date->diff 函数,如下面的示例:

   $dStart = new DateTime('2012-07-26');
   $dEnd  = new DateTime('2012-08-26');
   $dDiff = $dStart->diff($dEnd);
   echo $dDiff->format('%r%a'); // use for point out relation: smaller/greater

参见http://www.php.net/manual/zh/datetime.diff.php


3
此功能需要 PHP 5.3 或更高版本,就像 @txyoji 所述。 - levhita
20
使用$diffInDays = (int)$dDiff->format("%r%a");来获取可直接使用的值,如"-2"或"2"(有关格式参数说明,请参见http://www.php.net/manual/en/dateinterval.format.php)。 - flu
如果您不小心或者没有尝试将日期与时间一起输入,请将“-”更改为“:”。 - webrama.pl
1
为什么你会将date()函数放作DateTime构造函数的第一个参数?调用date('2012-07-26')函数会返回2012-07-26,所以我真的看不出来调用那个函数的意义。 - Glavić
<?php $datetime1 = date_create('2016-05-30'); $datetime2 = date_create('2016-05-30'); $interval = date_diff($datetime1, $datetime2); if($interval->days === 0){ echo "same date"; } else { echo "difference " . $interval->days . " days "; } ?> 输出: 同一天:same date - Naresh Kumar Nakka

55

strtotime函数将你的日期字符串转换成Unix时间戳(自Unix纪元以来的秒数)。

$ts1 = strtotime($date1);
$ts2 = strtotime($date2);

$seconds_diff = $ts2 - $ts1;

11
请注意,如果两个日期之间存在时间变更(如春季或秋季),则可能会导致不同的结果。尝试这样做:echo strtotime('2013-03-30 21:00') - strtotime('2013-03-29 21:00'); echo strtotime('2013-03-31 21:00') - strtotime('2013-03-30 21:00');你会得到86400和82800。实际上,这些结果是正确的。但是,如果您将结果除以86400以获取天数,那就需要考虑这一点(最好使用日期差异函数)。 - memical
2
如果您使用的是现代版本的PHP,请使用Adam的解决方案。PHP有很多代码来处理与时间相关的异常情况。 - txyoji

22

以下代码将通过计算两个日期之间的差异来输出天数。

$str = "Jul 02 2013";
$str = strtotime(date("M d Y ")) - (strtotime($str));
echo floor($str/3600/24);

尝试计算我的JQuery datepicker的日期差异时,floor给了我奇怪的结果。例如,floor((strtotime(((isset($_POST['date']) and strtotime($_POST['date'])) ? $_POST['date'] : date("Y-m-d"))) - strtotime(date("Y-m-d")))/3600/24))在3月31日和3月21日之间给出了9.9583333333333的差异(所以我期望得到10,但实际上是向下取整的9)。我使用了round函数来解决这个问题。 - Jonathan Parent Lévesque
是的,乔纳森,你说得对。 - Anirudh Sood
嘿,兄弟,我有一个疑问,你能解释一下在你的回声中3600/24的用途是什么吗? - Siva Ganesh
1
@SivaGanesh 他正在将时间戳转换为小时(/3600),然后再转换为天数(/24)。 - napolux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接