2つの日付間の日数を見つける


617

PHPを使用して2つの日付間の日数を見つける方法は?



6
1つのライナー:(new DateTime("2010-01-11"))->diff(new DateTime("2019-08-19"))->days;
ビリーノア

@billynoah-これは最もクリーンでシンプルな答えです!
リンガー

回答:


907
$now = time(); // or your date as well
$your_date = strtotime("2010-01-31");
$datediff = $now - $your_date;

echo round($datediff / (60 * 60 * 24));

39
負の日数を返すと関連情報が得られると思います。また$your_date-$now、将来の日付で正の整数を返す場合は、を使用する必要があります。
Tim

23
うるう秒はどうですか?すべての日に正確に24 * 60 * 60秒があるとは限りません。このコードは実際的な目的には十分かもしれませんが、非常にまれなエッジのケースでは正確ではありません。
ベンジャミンブリッツィ

49
うるう秒を忘れます(いいえ、実際にはそれらも考慮します)が、これは夏時間の変更を考慮していません。毎年それらの境界を越えて丸一日外れる可能性があります。DateTimeクラスを使用する必要があります。
Levi

6
@billynoah申し訳ありませんが、コメントを更新するために戻ってきたことはありません。夏時間帯に注意する必要があります。夏時間のある日付と日付のない日付を比較すると、たとえば7日ではなく6.9日が返されます。フロアリターン6の代わりに、7撮る
アレックス・アンジェリコ

4
strtotime()は20年で失敗するだけでなく、現在は使用できません。OPは、時間ではなく日付を指定しました。日付はかなり古い可能性があります。簡単な答えは次のとおりです。$ NumberDays = gregoriantojd($ EndM、$ EndD、$ EndY)-gregoriantojd($ StartM、$ StartD、$ StartY); (包括的範囲の場合)。日時クラスとは異なり、グレゴリオからジュリアンはv4以降で使用できます。有効な範囲は、紀元前4714年から9999年です。ファンキーなパラメーターの順序に注意してください(phpに警告が必要な場合など)。
Guy Gordon

524

を使用している場合PHP 5.3 >、これは差を計算する最も正確な方法です。

$earlier = new DateTime("2010-07-06");
$later = new DateTime("2010-07-09");

$diff = $later->diff($earlier)->format("%a");

14
特定の時点ではなく時間間隔について話しているため、フォーマット構文は、date()およびstrftime()構文とは異なることに注意してください。時間間隔の構文は次の場所にあります:php.net/manual/en/dateinterval.format.php
Andrew

1
または私の場合、日数は$ date2-> diff($ date1)-> format( "%a")-1
xeo

13
日付に時間がある場合、これは期待どおりに機能しないことに注意してください。あなたが23:30の間隔を持っている...そして、彼らは別の日にしている場合たとえば、違いが0になります。
Layke

20
相対的な日数が必要な場合($date1がの前にある場合は負$date2)、$diff = $date2->diff($date1)->format("%r%a");代わりに使用します。
Socce 2015

1
?の日付の形式は何DateTime("2010-07-06")ですか、それは?Y-m-dまたはY-d-m?、DateTimeパラメーターの形式は何ですか。どれが日ですか?
151291

165

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

以下のような結果:

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
)

それが役に立てば幸い !


8
はい、これは受け入れられた回答よりも良いように見えますが、これは場合によっては機能しません。例:$ from = '2014-03-01'; $ to = '2014-03-31';
MBozic 2014年

1
私は同意します、とても簡単にフォローできて素晴らしいです!!! date_default_timezone_set()関数を使用することを忘れないでください。そうしないと、UTC時間に基づく奇妙な結果が得られます。
zeckdude 2015

2
この機能は、1980年から2020年までの間に14603回のテスト0失敗
LSerni

128

日付をUNIXタイムスタンプに変換し、次に1を減算します。これにより、秒単位の差が得られます。86400(1日の秒数)で割ると、その範囲のおおよその日数が得られます。

あなたの日付が形式である場合25.1.201001/25/2010または2010-01-25、あなたが使用できるstrtotime機能を:

$start = strtotime('2010-01-25');
$end = strtotime('2010-02-20');

$days_between = ceil(abs($end - $start) / 86400);

使用する ceilすると、日数は次の丸一日に丸められます。floorこれら2つの日付の間の丸1日の量を取得する場合は、代わりに使用してください。

日付がすでにUNIXタイムスタンプ形式である場合は、変換をスキップして、その$days_between部分を実行できます。よりエキゾチックな日付形式の場合、正しく解釈するためにカスタム解析を行う必要がある場合があります。


9
DSTはどうですか?
toon81 2013

3
@ toon81- このような混乱を避けるために、Unixタイムスタンプを使用します!;)
Alastair 2013

6
詳しく説明します。今朝の午前3時に、ヨーロッパのほぼすべてで時計が1時間戻ったとします。つまり、今日は3600秒余分にあり、それはUNIXタイムスタンプに反映されるべきです。もしそうなら、それは、日数を計算する上記の方法で今日が2日間カウントされることを意味します。また、うるう秒については、PHPもUNIXも考慮に入れていないようです(IMOは実際には理解可能です)。TL; DR:すべての日が86,400秒であるとは限りません
toon81 2013

2
@ toon81その日付には3600秒以上ありません。DSTとの間でやり取りする場合、UNIXタイムスタンプには何も起こりません。
nickdnk 2015

1
何もUNIXタイムスタンプに起こらない場合、あなたは私と一緒に同意する:1PMでのUNIXタイムスタンプ間の差の$day上の午後1時とUNIXタイムスタンプ$day+1DSTを観察するタイムゾーンに常に86400秒ではありませんが。24時間ではなく、23時間または25時間の秒数になる場合があります。
toon81

112

TL; DRはUNIXタイムスタンプを使用しません使用しないでくださいtime()。そうした場合、調製することがその98.0825パーセントの信頼性があなたを失敗するはずです。DateTime(またはCarbon)を使用します。

正解は Sakshamグプタ(他の回答も正確である)によって与えられたものです。

$date1 = new DateTime('2010-07-06');
$date2 = new DateTime('2010-07-09');
$days  = $date2->diff($date1)->format('%a');

または手続き的にワンライナーとして:

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

注意点: '%a'は絶対日数を示しているようです。符号付き整数、つまり2番目の日付が最初の日付の前にある場合は負の値にする場合は、 '%r'プレフィックスを使用する必要があります(つまりformat('%r%a'))。


本当にUNIXタイムスタンプを使用する必要がある場合は、タイムゾーンをGMT設定して、ほとんどの以下で説明するの落とし穴。


長い答え:24 * 60 * 60(別名86400)による除算が安全でない理由

UNIXタイムスタンプ(および86400を日数に変換する)を使用するほとんどの回答は、2つの仮定に基づいており、まとめると、間違った結果微妙なバグのあるシナリオにつながる可能性がありますを追跡することは困難であり、そして数日、数週間または数ヶ月後に発生します成功した展開。ソリューションが機能しないということではありません-機能します。今日。しかし、明日は機能しなくなる可能性があります。

最初の間違いは、「昨日から何日経過したのか」という質問に対して、現在と「昨日」で示される瞬間の間で丸一日が経過しなかった場合、コンピュータが正直にゼロと答える可能性があることを考慮していません。

通常、「日」をUNIXタイムスタンプに変換する場合、取得されるのはその日の真夜中のタイムスタンプです。

10月1日から15日の真夜中に15日が経過しました。ただし、10月1日の13:00から10月15日の14:55までの間に15日マイナス5分が経過したため、floor()暗黙の整数変換使用または実行するほとんどのソリューションでは、予想よりも1日少ないレポートになります。

それで、「Ymd H:i:sは何日前ですか?」得られます間違った答えを

2番目の間違いは、1日を86400秒に相当します。これはほとんどの場合当てはまります。そうでない場合を見逃すほど頻繁に発生します。しかし、2つの連続する真夜中の秒単位の距離は確かに夏時間が始まる、少なくとも年に2回は86400ません。DSTの境界を越えて2つの日付を比較すると、誤った答えが返されます。

したがって、すべての日付のタイムスタンプを固定時間に強制する「ハック」を使用する場合でも、真夜中と言います(これは、日-月-年のみを指定し、時分秒も指定しない場合、さまざまな言語とフレームワークによって暗黙的に行われます。同じことがMySQLなどのデータベースでDATE型で発生します)、広く使用されている式

 (unix_timestamp(DATE2) - unix_timestamp(DATE1)) / 86400

または

 floor(time() - strtotime($somedate)) / 86400

たとえば、DATE1とDATE2がその年の同じDSTセグメントにある場合、17を返します。しかし、17.042、さらに悪い場合は16.958を返す可能性があります。次に、floor()または暗黙の切り捨てを整数に使用すると、17であったはずのものが16に変換されます。他の状況では、「$ days> 17」のような式trueは、経過日数が18です。

また、そのようなコードプラットフォーム間で移植できないため、うるう秒を適用するものと適用しないものがあるため、状況はさらに醜くなります。を実行するこれらのプラットフォームで、2つの日付の差は86400ではなく86401、または86399になります。したがって、5月に機能し、実際にすべてのテストに合格したコードは、来年の6月に、13ではなく12.99999日と見なされると、12日と見なされます。 2015年に機能したものは2017年には機能しません。同じ日付で、どちらの年もうるう年ではありません。しかし、2018-03-01と2017-03-01の間で、問題のあるプラットフォームでは、365日ではなく366日が経過し、2018年はうるう年になります(そうではありません)。

したがって、本当に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の間で変換します。残りの時間は常に約20時間です。これは、21時間または19時間、場合によっては18時間59分36秒になる可能性があります。どんなに。それはそこにとどまり、予見可能な将来のために前向きにとどまる大きなマージンです。これfloor()、安全に切り捨てることができます。

ただし、魔法の定数を回避するための正しい解決策は、kludgeと保守債務を四捨五入することです。

  • タイムライブラリ(Datetime、Carbonなど)を使用します。自分で転がしてはいけない

  • ありふれた日付だけでなく、DSTの境界を越え、うるう年を越え、うるう秒を越えてなど、本当に邪悪な日付の選択を使用して包括的なテストケースを記述します。理想的には(datetimeへの呼び出しは高速です)、4年間(および1日)相当の日付を文字列から順番に組み合わせて生成し、最初の日とテストする日の差が着実に1ずつ増えるようにします。これにより、低レベルのルーチンとうるう秒の修正で何か変更があった場合、少なくともあなたは知っているでしょう。

  • これらのテストを残りのテストスイートと共に定期的に実行します。それらはミリ秒単位の問題であり、文字通り頭を掻く時間を節約するかもしれません。


ソリューションが何であれ、テストしてください!

funcdiff以下の関数は、現実のシナリオでソリューションの1つ(たまたま受け入れられたもの)を実装します。

<?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";

結果は、

This function failed 280 of its 14603 tests

ホラーストーリー:「時間の節約」のコスト

これは実際には数か月前に起こりました。巧妙なプログラマーは、悪名高い "(MidnightOfDateB-MidnightOfDateA)/ 86400"コードをいくつかの場所に接続することで、最大で約30秒かかった計算を数マイクロ秒節約することを決定しました。彼はそれを文書化することさえしなかったほど明らかに最適化であり、最適化は統合テストに合格し、数ヶ月間コードに潜んでいたが、すべて気づかれなかった。

これは、売れ筋のセールスマン数人の賃金を計算するプログラムで発生しました。そのうちの最も売れ行きの悪いセールスマンは、謙虚な5人のプログラマーチーム全体をまとめたものよりも恐ろしいほど強力です。数か月前のある日、ほとんど問題にならない理由で、バグが発生しました-そして、それらの人の一部は、脂肪のコミッションの丸一日で交換されました。彼らは間違いなく面白がっていなかった

無限に悪化し、彼らは(すでに非常に少ない)、彼らはプログラムの中で持っていた信仰失われていないと-内密にして、シャフト、およびふりをするように設計されて -テストケースとの完全な、詳細なコードレビューを走り、普通の言葉でコメント(プラス多くのことを次の週のレッドカーペット処理の)。

私が言えること:プラスの面では、多くの技術的負債を取り除き、90年代のスイングでCOBOLの蔓延に耳を傾けたスパゲッティの混乱のいくつかを書き直し、リファクタリングすることができました。このプログラムは間違いなくより適切に実行されるようになり、何かが怪しいように見えたときにすぐにゼロにするためのより多くのデバッグ情報があります。この最後の1つのことだけで、当面は1か月あたり1〜2人日が節約できると予測しています。

マイナス面では、全体として、会社全体の費用は前払いで約200,000ユーロでした-プラス面に加えて、間違いなくある程度の交渉力(そして、それゆえに、さらに多くのお金)。

「最適化」の責任者は震災前の1年前に転職しましたが、それでも損害賠償を求めて訴訟を起こす話がありました。そして、それが「最後の男のせい」であるという上層部とうまくいかなかった-それは私たちが問題を片付けるためのセットアップのように見え、結局、私たちはまだ犬小屋にいますそして、チームの1人が辞めることを計画しています。

100のうち99回は、「86400ハッキング」は問題なく機能します。(たとえば、PHPでは、strtotime()DSTを無視し、10月の最後の土曜日の深夜から次の月曜日の深夜までの間に、2 * 24 * 60 * 60秒が経過したことを報告します。そして2つの間違いは幸福にも1つを正しくします)。

これは、紳士淑女の皆さん、そうではなかった1つの例でした。エアバッグやシートベルトと同様に、またはの複雑さ(および使いやすさ)が本当に必要になることは決してないでしょう。しかし、あなたがそうするかもしれない日(または、あなたこれについて考えたことを証明しなければならない日)は、夜に泥棒になります。準備して。DateTimeCarbon


7
これらの答えを見たとき、私はいつもDateTimeを使用しているので、私は愚かで頭がおかしいと思っていましたが、DateTimeを使用するのが正しい方法であることを理解しました。ありがとう
Syncro 2017

ねえ、ここのみんな、SOでは、days between two days in php人生が短すぎて自分ですべてを書くことができないからといって、グーグルなどで検索してここに来ました。
Denis Matafonov

1
詳細な説明。+ 1
Anant Singh --- Alive to Die

1
時々私は質問の代わりに答えを好きにしたいです。
クレメントバコニエ

これは受け入れられる答えでなければなりません。
フランツ

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

これは、DateTimeクラスを使用してこれを行うための適切な手続き型の方法です。間隔オブジェクト($diffこの場合は変数)を明確に使用していないだけです。何か if ($diff->days > 30) { [doyourstuff]; }
グスタフギル2016

16

オブジェクト指向スタイル:

$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');

手続き型:

$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$interval = date_diff($datetime1, $datetime2);
echo $interval->format('%R%a days');

11

これを使用:)

$days = (strtotime($endDate) - strtotime($startDate)) / (60 * 60 * 24);
print $days;

今ではうまくいきます


14
上記の非常に古いコメントですが、正しくありません。StackOverflowのではないあなたがあなた自身の質問を(あなたがしても答えることができ尋ねるあなたの質問に)。しかし、誰かが同じ解決策をすでに投稿した後に自分で質問に答えることは失礼と見なされます。
Maarten Bodewes 2014年

この機能は、1980年から2020年の間にその14603回のテストの560失敗
LSerni

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**

したがって、正しい解決策は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**

7

2つの日付の差を計算します。

$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");

$diff=date_diff($date1,$date2);

echo $diff->format("%R%a days");

出力:+272日

date_diff()関数は、2つのDateTimeオブジェクトの差を返します。


6
$start = '2013-09-08';
$end = '2013-09-15';
$diff = (strtotime($end)- strtotime($start))/24/3600; 
echo $diff;

この機能は、1980年から2020年の間にその14603回のテストの560失敗
LSerni

6

私は作曲家プロジェクトでこの目的と同様の目的のためにCarbonを使用しています。

次のように簡単です。

$dt = Carbon::parse('2010-01-01');
echo $dt->diffInDays(Carbon::now());

5

あなたは簡単に日付を見つけることができます

<?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

4
$datediff = floor(strtotime($date1)/(60*60*24)) - floor(strtotime($date2)/(60*60*24));

そして、必要に応じて:

$datediff=abs($datediff);

3

秒単位の時間がある場合(IE unixタイムスタンプ)、時間を減算して86400(1日あたりの秒数)で割ることができます。


3

PHPの2つの日付間の日数

      function dateDiff($date1, $date2)  //days find function
        { 
            $diff = strtotime($date2) - strtotime($date1); 
            return abs(round($diff / 86400)); 
        } 
       //start day
       $date1 = "11-10-2018";        
       // end day
       $date2 = "31-10-2018";    
       // call the days find fun store to variable 
       $dateDiff = dateDiff($date1, $date2); 

       echo "Difference between two dates: ". $dateDiff . " Days "; 

1
チャームのようにうまく機能しました。86400numの意味は何ですか?
Parth Shah

86400の数値は、1日= 24時間、24 * 60 * 60 = 86400秒(1日)に使用されます
mallikarjun SK

3

以下のコードを試すことができます:

$dt1 = strtotime("2019-12-12"); //Enter your first date
$dt2 = strtotime("12-12-2020"); //Enter your second date
echo abs(($dt1 - $dt2) / (60 * 60 * 24));

2
既存の回答がある古い質問の場合、回答が質問にもたらす新しい側面を説明すると便利です。必要に応じて、質問した後に発生した可能性のある変更を承認することも役立ちます。
Jason Aller

2
function howManyDays($startDate,$endDate) {

    $date1  = strtotime($startDate." 0:00:00");
    $date2  = strtotime($endDate." 23:59:59");
    $res    =  (int)(($date2-$date1)/86400);        

return $res;
} 

この機能は、1980年から2020年の間にその14603回のテストの320失敗
LSerni

2

開始日と終了日の間のすべての日をエコーし​​たい場合、私はこれを思いつきました:

$startdatum = $_POST['start']; // starting date
$einddatum = $_POST['eind']; // end date

$now = strtotime($startdatum);
$your_date = strtotime($einddatum);
$datediff = $your_date - $now;
$number = floor($datediff/(60*60*24));

for($i=0;$i <= $number; $i++)
{
    echo date('d-m-Y' ,strtotime("+".$i." day"))."<br>";
}

2

2つの日付間の日の違いを見つける最も簡単な方法

$date1 = strtotime("2019-05-25"); 
$date2 = strtotime("2010-06-23");

$date_difference = $date2 - $date1;

$result =  round( $date_difference / (60 * 60 * 24) );

echo $result;

1
    // Change this to the day in the future
$day = 15;

// Change this to the month in the future
$month = 11;

// Change this to the year in the future
$year = 2012;

// $days is the number of days between now and the date in the future
$days = (int)((mktime (0,0,0,$month,$day,$year) - time(void))/86400);

echo "There are $days days until $day/$month/$year";

1

2番目のパラメーターが渡された場合に1年2か月25日を表示する私の改良版は次のとおりです。

class App_Sandbox_String_Util {
    /**
     * Usage: App_Sandbox_String_Util::getDateDiff();
     * @param int $your_date timestamp
     * @param bool $hr human readable. e.g. 1 year(s) 2 day(s)
     * @see http://stackoverflow.com/questions/2040560/finding-the-number-of-days-between-two-dates
     * @see http://qSandbox.com
     */
    static public function getDateDiff($your_date, $hr = 0) {
        $now = time(); // or your date as well
        $datediff = $now - $your_date;
        $days = floor( $datediff / ( 3600 * 24 ) );

        $label = '';

        if ($hr) {
            if ($days >= 365) { // over a year
                $years = floor($days / 365);
                $label .= $years . ' Year(s)';
                $days -= 365 * $years;
            }

            if ($days) {
                $months = floor( $days / 30 );
                $label .= ' ' . $months . ' Month(s)';
                $days -= 30 * $months;
            }

            if ($days) {
                $label .= ' ' . $days . ' day(s)';
            }
        } else {
            $label = $days;
        }

        return $label;
    }
}

1
$early_start_date = date2sql($_POST['early_leave_date']);


$date = new DateTime($early_start_date);
$date->modify('+1 day');


$date_a = new DateTime($early_start_date . ' ' . $_POST['start_hr'] . ':' . $_POST['start_mm']);
$date_b = new DateTime($date->format('Y-m-d') . ' ' . $_POST['end_hr'] . ':' . $_POST['end_mm']);

$interval = date_diff($date_a, $date_b);


$time = $interval->format('%h:%i');
$parsed = date_parse($time);
$seconds = $parsed['hour'] * 3600 + $parsed['minute'] * 60;
//        display_error($seconds);

$second3 = $employee_information['shift'] * 60 * 60;

if ($second3 < $seconds)
    display_error(_('Leave time can not be greater than shift time.Please try again........'));
    set_focus('start_hr');
    set_focus('end_hr');
    return FALSE;
}

1
<?php
$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
echo $diff->format("%R%a days");
?>

上記のコードを非常に簡単に使用しました。ありがとう。


1
function get_daydiff($end_date,$today)
{
    if($today=='')
    {
        $today=date('Y-m-d');
    }
    $str = floor(strtotime($end_date)/(60*60*24)) - floor(strtotime($today)/(60*60*24));
    return $str;
}
$d1 = "2018-12-31";
$d2 = "2018-06-06";
echo get_daydiff($d1, $d2);

1

この単純な関数を使用します。関数を宣言する

<?php
function dateDiff($firstDate,$secondDate){
    $firstDate = strtotime($firstDate);
    $secondDate = strtotime($secondDate);

    $datediff = $firstDate - $secondDate;
    $output = round($datediff / (60 * 60 * 24));
    return $output;
}
?>

そしてあなたが望むところにこのようなこの関数を呼び出します

<?php
    echo dateDiff("2018-01-01","2018-12-31");    

// OR

    $firstDate = "2018-01-01";
    $secondDate = "2018-01-01";
    echo dateDiff($firstDate,$secondDate);    
?>

1
$diff = strtotime('2019-11-25') - strtotime('2019-11-10');
echo abs(round($diff / 86400));

2
SOへようこそ!コードのみで投稿に返信する場合は、少し説明してください。あなたが持ってくるコードは、2019-11-10と2019-11-25の間で計算されています。そのため、質問には答えていません。だから、反対票を投じるよりもPO​​Vをよく説明するのが良いでしょう。
DavidGarcíaBodego

0

MySqlを使用している場合

function daysSince($date, $date2){
$q = "SELECT DATEDIFF('$date','$date2') AS days;";
$result = execQ($q);
$row = mysql_fetch_array($result,MYSQL_BOTH);
return ($row[0]);

}

function execQ($q){
$result = mysql_query( $q);
if(!$result){echo ('Database error execQ' . mysql_error());echo $q;}    
return $result;

}


0

カーボンを使ってみてください

$d1 = \Carbon\Carbon::now()->subDays(92);
$d2 = \Carbon\Carbon::now()->subDays(10);
$days_btw = $d1->diffInDays($d2);

また使用できます

\Carbon\Carbon::parse('')

指定されたタイムスタンプ文字列を使用してCarbon日付のオブジェクトを作成します。


これと私の答えの違いは何ですか?
アルダ

1
単純な日付の違いを行うには、まったく新しいパッケージを含めることをお勧めしますか?
tomazahlin 2018年

0

すべての回答を見て、すべてのPHPバージョンで機能するユニバーサル関数を作成します。

if(!function_exists('date_between')) :
    function date_between($date_start, $date_end)
    {
        if(!$date_start || !$date_end) return 0;

        if( class_exists('DateTime') )
        {
            $date_start = new DateTime( $date_start );
            $date_end   = new DateTime( $date_end );
            return $date_end->diff($date_start)->format('%a');
        }
        else
        {           
            return abs( round( ( strtotime($date_start) - strtotime($date_end) ) / 86400 ) );
        }
    }
endif;

一般的に、私は2つの日付の間の日を見つけるために「DateTime」を使用します。ただし、何らかの理由で一部のサーバー設定で「DateTime」が有効になっていない場合、「strtotime()」を使用した単純な(ただし安全ではない)計算が使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.