PHP中最好的(以日期格式无关的方式)来计算指定格式的两个日期之间的天数差异。
我尝试了以下功能:
function get_date_offset($start_date, $end_date)
{
$start_time = strtotime($start_date);
$end_time = strtotime($end_date);
return round(($end_time-$start_time)/(3600*24));
}
它在linux机箱上运行正常,但在windows下运行时,strtotime返回''。
修改:
输入日期采用 mm / dd / yyyy 格式,但我想让它接受$ format作为参数。
我只需要几天的差异。
答案 0 :(得分:6)
如果你不想或你不能使用Zend Framework或Pear包试试这个功能我希望这会有所帮助:
function dateDifference($date1, $date2)
{
$d1 = (is_string($date1) ? strtotime($date1) : $date1);
$d2 = (is_string($date2) ? strtotime($date2) : $date2);
$diff_secs = abs($d1 - $d2);
$base_year = min(date("Y", $d1), date("Y", $d2));
$diff = mktime(0, 0, $diff_secs, 1, 1, $base_year);
return array
(
"years" => abs(substr(date('Ymd', $d1) - date('Ymd', $d2), 0, -4)),
"months_total" => (date("Y", $diff) - $base_year) * 12 + date("n", $diff) - 1,
"months" => date("n", $diff) - 1,
"days_total" => floor($diff_secs / (3600 * 24)),
"days" => date("j", $diff) - 1,
"hours_total" => floor($diff_secs / 3600),
"hours" => date("G", $diff),
"minutes_total" => floor($diff_secs / 60),
"minutes" => (int) date("i", $diff),
"seconds_total" => $diff_secs,
"seconds" => (int) date("s", $diff)
);
}
答案 1 :(得分:4)
PEAR Date类提供各种功能,用于查找日期和大约1000个其他内容之间的差异。它的文档是here...
答案 2 :(得分:3)
PHP的问题在于它没有明确的DateTime类型。您可以使用Unix时间戳或内置的DateTime类,但它们的功能非常有限。我希望应该有一些第三方课程对日期时间计算提供更广泛的支持,但我没有找到它。
使用Unix时间戳进行日期(而不是时间)计算也很棘手。您必须丢弃时间部分,但由于夏令时(DST),简单地重置为00:00是不安全的。 DST的影响是每年有两天没有完全24小时。因此,在添加/减去日期时,您最终可能会得到一个不能与3600 * 24平均分配的值。
我建议找一些对所有这些东西都有适当支持的第三方课程。日期/时间的计算很丑陋。 :P
答案 3 :(得分:2)
Zend Framework具有用于处理“日期数学”的类Zend_Date。它通过使用BCMath扩展来解决系统特定的时间戳限制,或者如果不可用,则将时间戳限制为系统的最大浮点值。
// example printing difference in days
require('Zend/Date.php');
$date1 = new Zend_Date();
$date1->set(2, Zend_Date::MONTH);
$date1->set(27, Zend_Date::DAY);
$date1->set(2008, Zend_Date::YEAR);
$date2 = new Zend_Date();
$date2->set(3, Zend_Date::MONTH);
$date2->set(3, Zend_Date::DAY);
$date2->set(2008, Zend_Date::YEAR);
echo ($date2->getTimestamp() - $date1->getTimestamp()) / (3600*24);
答案 4 :(得分:1)
我不确定什么是最好,因为PHP中没有用于执行此操作的内置函数,但有些人使用gregoriantojd(),例如在{{ 3}}
答案 5 :(得分:1)
gregoriantojd()给出与使用strtotime()相同的结果,请参阅此博客文章了解如何执行此操作:
答案 6 :(得分:1)
以下适用于我。相信我在某处的php.net文档中找到了它。
*编辑 - Woops,没看到csl的帖子。这是他的链接的确切功能,一定是我发现它的地方。 ;)
//Find the difference between two dates
function dateDiff($startDate, $endDate)
{
// Parse dates for conversion
$startArry = date_parse($startDate);
$endArry = date_parse($endDate);
// Convert dates to Julian Days
$start_date = gregoriantojd($startArry["month"], $startArry["day"], $startArry["year"]);
$end_date = gregoriantojd($endArry["month"], $endArry["day"], $endArry["year"]);
// Return difference
return round(($end_date - $start_date), 0);
}
答案 7 :(得分:1)
我试图计算两个日期的差异,以显示事件的持续时间。如果事件的持续时间为星期五17:00到星期日15:00,则问题上给出的大部分功能都会失败。我的目标是找到日期之间的区别,如:
date('Ymd',$end)-date('Tmd',$begining);
但这很可能失败,因为一年没有99个月,一个月没有99天。我可以将日期字符串转换为UNIX时间戳并除以60 * 60 * 12,但有些日子会有更多或更少的小时数,有时甚至会有一个闰跳。所以我使用getdate()函数创建了自己的函数,该函数返回有关时间戳的信息数组。
/*
* datediff($first,$last)
* $first - unix timestamp or string aksepted by strtotime()
* $last - unix timestamp or string aksepted by strtotime()
*
* return - the difference in days betveen the two dates
*/
function datediff($first,$last){
$first = is_numeric($first) ? $first : strtotime($first);
$last = is_numeric($last ) ? $last : strtotime($last );
if ($last<$first){
// Can't calculate negative difference in dates
return -1;
}
$first = getdate($first);
$last = getdate($last );
// find the difference in days since the start of the year
$datediff = $last['yday'] - $first['yday'];
// if the years do not match add the appropriate number of days.
$yearCountedFrom = $first['year'];
while($last['year'] != $yearCountedFrom ){
// Take leap years into account
if( $yearCountedFrom % 4 == 0 && $yearCountedFrom != 1900 && $yearCountedFrom != 2100 ){
//leap year
$datediff += 366;
}else{
$datediff += 365;
}
$yearCountedFrom++;
}
return $datediff;
}
关于GregorianToJD()函数,它可能有效,但我感到有点不安,因为我不明白它是如何工作的。
答案 8 :(得分:0)
让我们不要过度工作,伙计们。
$d1 = strtotime($first_date);
$d2 = strtotime($second_date);
$delta = $d2 - $d1;
$num_days = ($delta / 86400);
答案 9 :(得分:0)
使用Php计算两个日期(和时间)之间的差异。以下页面提供了一系列不同的方法(总共7个),用于使用Php进行日期/时间计算,以确定两个日期之间的时间差(小时,分钟),天,月或年。
请参阅Php Date Time - 7 Methods to Calculate the Difference between 2 dates
答案 10 :(得分:0)
PHP 5.2引入了DateTime和DateInterval类,这使得这很容易:
function get_date_offset($start_date, $end_date)
{
$start_time = new DateTime($start_date);
$end_time = new DateTime($end_date);
$interval = $end_time->diff($start_time);
return $interval->format('%a days');
}