2

指定された形式の2つの日付間の日数の差を計算するための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を受け入れさせたいと思います。

日数の違いだけが必要です。

4

11 に答える 11

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)
    );
}
于 2008-12-23T14:56:41.960 に答える
4

PEAR の Date クラスは、日付の違いを検出するためのあらゆる種類の機能と、その他約 1000 の機能を提供します。そのためのドキュメントはここにあります...

于 2008-12-23T11:54:28.910 に答える
3

PHP の問題は、明確な DateTime 型がないことです。Unix タイムスタンプまたは組み込みの DateTime クラスを使用できますが、機能はかなり制限されています。日時の計算をより広範囲にサポートするサードパーティのクラスがいくつかあるはずですが、探していません。

日付 (時間ではない) の計算に Unix タイムスタンプを使用するのも注意が必要です。時刻の部分を破棄する必要がありますが、単純に 00:00 にリセットするのは夏時間 (DST) のため安全ではありません。DST には、正確に 24 時間がない日が毎年 2 日あるという効果があります。したがって、日付を加算/減算すると、3600*24 で割り切れない値になる可能性があります。

これらすべてを適切にサポートしているサードパーティのクラスを探すことをお勧めします。日付/時刻の計算は、醜い点で素晴らしいです。:P

于 2008-12-23T11:53:21.673 に答える
2

Zend Framework には、「日付計算」を処理するクラスZend_Dateがあります。BCMath 拡張機能を使用してシステム固有のタイムスタンプ制限を回避するか、それが利用できない場合は、システムの最大 float 値によってタイムスタンプを制限します。

// 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);
于 2008-12-23T13:40:10.833 に答える
1

PHPにはこれを行うための組み込み関数がないため、何が最適と見なされるかはわかりませんが、たとえばこのフォーラムの投稿でgregoriantojd()を使用している人もいます。

于 2008-12-23T11:40:29.780 に答える
1

イベントの期間を示す目的で、2 つの日付の差を計算しようとしていました。イベントの期間が金曜日の 17:00 から日曜日の 15:00 までの場合、問題で指定された関数のほとんどが失敗します。私の目標は、次のような日付の違いを見つけることでした:

date('Ymd',$end)-date('Tmd',$begining);

しかし、1 年は 99 か月、1 か月は 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()関数に関しては動くかもしれませんが、仕組みがよくわからないので少し不安です。

于 2009-09-05T06:55:13.093 に答える
1

gregoriantojd() は、strtotime() を使用した場合と同じ結果をもたらします。その方法については、このブログ投稿を参照してください。

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

于 2009-05-12T23:51:39.693 に答える
1

以下は私にとってはうまくいきます。どこかのphp.netドキュメントで見つけたと信じています。

*編集 - おっと、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);
}
于 2009-05-13T00:04:37.083 に答える
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');
}
于 2013-01-30T02:12:17.660 に答える
0

みんな、オーバーエンジニアリングしないようにしましょう。

$d1 = strtotime($first_date);
$d2 = strtotime($second_date);
$delta = $d2 - $d1;
$num_days = ($delta / 86400);
于 2008-12-23T18:57:47.543 に答える
0

PHP を使用して 2 つの日付 (および時刻) の差を計算します。次のページでは、2 つの日付間の時間 (時間、分)、日、月、または年の差を判断するために、Php を使用して日付/時刻の計算を実行するためのさまざまな方法 (合計 7 つ) を提供します。

Php Date Time - 2 つの日付の差を計算する 7 つの方法を参照してください。

于 2010-01-06T06:38:21.887 に答える