PHP日期计算

时间:2008-12-23 11:33:51

标签: php windows date format

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作为参数。

我只需要几天的差异。

11 个答案:

答案 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()相同的结果,请参阅此博客文章了解如何执行此操作:

http://www.phpro.org/examples/Calculate-Age-With-PHP.html

答案 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引入了DateTimeDateInterval类,这使得这很容易:

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