2017-10-31 22 views
0

私は2つの日付間の月の違いをより具体的な方法で計算しようとしています。 2017年11月1日と結果が3ヶ月であるように私は必要なもの2018年1月31日PHPは2つの日付の間の満月の数を計算します

は例えば、私は2つの日付を持っています。つまり、この2つの日付の間に3つの完全な請求月があります。ここで

は、動作するようになっています方法です:

  • 月1:2017年11月1日
  • 2017年11月30日まで月2:2017年12月1日2017年12月31日まで
  • 月3:2018年1月1日

2018年1月31日まで、私はDateTimeクラスでの差分法を試してみましたが、それはあまり役に立たない何かを作り出します。ここに例があります

<?php 
$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00'); 
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-31 00:00:00'); 
$diff = $date1->diff($date2); 
print_r($diff) 

result: 
DateInterval Object 
(
    [y] => 0 
    [m] => 2 
    [d] => 30 
    [h] => 0 
    [i] => 0 
    [s] => 0 
    [weekday] => 0 
    [weekday_behavior] => 0 
    [first_last_day_of] => 0 
    [invert] => 0 
    [days] => 91 
    [special_type] => 0 
    [special_amount] => 0 
    [have_weekday_relative] => 0 
    [have_special_relative] => 0 
) 

2か月と30日を示します。

しかし、わずかに異なるシナリオ

$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00'); 
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-30 00:00:00'); 

にこれら2つの日付の間の差分は、2ヶ月と30日ではなく、3ヶ月を表示する必要があります。

ご意見やご感想をいただければ幸いです。

+0

可能な重複)](https://stackoverflow.com/questions/1607336/calculate-difference-between-too-dates-number-of-days) – 534F

+0

@ 534F - この質問はPHPに関するものです。あなたのリンクはC#についてです。 –

+2

[PHPを使用して2つの日付の違いを計算する方法]の可能な複製?(https://stackoverflow.com/questions/676824/how-to-calculate-the-difference-between-two-dates-using-php) – Mohit

答えて

1

比較を行う前に終了日に1日を追加します。元の終了日がその月の最後の日だった場合、新しい終了日が翌月にロールオーバーされ、diffオブジェクトに正しい月数が表示されます。元の日付がだが月の最終日であるだった場合は、結果は変更されません。

$start = '2017-11-01'; 
$end = '2018-01-31'; 

$date1 = DateTime::createFromFormat('Y-m-d', $start); 
$date2 = DateTime::createFromFormat('Y-m-d', $end)->add(new DateInterval('P1D')); 

echo $date1->diff($date2)->m, "\n"; 
+0

'DateTime'の両方のインスタンスの時刻が現在の時刻(指定されていないため)であるため、最終日は含まれていません。より良い解決策は、 '$ date2'を使う必要がある場合に、' $ date1-> setTime(0、0、0);を実行することです。 $ date2-> setTime(0、0、1); 'を追加する代わりに、 – ishegg

+0

それは望ましい結果を達成しません。 OPの範囲の最後の日がその月の最後の日であれば、diffの結果の1カ月分をカウントするには '$ diff-> m'が必要です。diff()はしません。時間。 –

+0

ああ、そうだ。私が推測するすべてを誤解します。 +1 – ishegg

0

計算中に1日失ったようです。最初の/最後の日を含めて数ヶ月間の間隔が必要なので、この日を間隔に追加する必要があります。

ので、この場合の解決策は次のようになります。

$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00'); 
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-31 23:59:59'); 
$diff = $date1->diff($date2); 

か:

$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-10-31 00:00:00'); 
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-31 00:00:00'); 
$diff = $date1->diff($date2); 

かさえ:[(2つの日付の差を計算する数の

$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00'); 
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-02-01 00:00:00'); 
$diff = $date1->diff($date2); 
関連する問題