4

この問題の適切な解決策を見つけることができませんでした。PHPドキュメントの例3に示されているように、DateTime :: addでDateIntervalを使用して月を追加する場合は、注意が必要であると記載されています。

メソッドの動作がそのようなものである理由と、これを回避するために私ができることについての説明は実際にはありません。これは一見したところエラーであることがわかります。

誰かがこれについていくつかの洞察を持っていますか?

4

2 に答える 2

7

問題は、毎月異なる日数が含まれる可能性があることです。問題は、日付を1か月ずつインクリメントしたいときに何をしているのかということです。PHPのドキュメントによると、1月31日(または30日)に1か月追加した場合、予想される動作は何ですか?

2月は29日しかありません。月末に設定しますか?それがあなたが探しているものであるならば、あなたは一般的に設定された日数、または現在の日付に基づく静的な日付によってより安全に増分します。月をインクリメントするときに何を達成しようとしているのかがわからないと、エラーを監視する方法を言うのは難しいです。

編集:
誰かが上記のマイクBによってコメントされた同様の投稿で言及しているように、あなたはおそらくあなたが(擬似コードで)何かをしたいと思うでしょう:

 1) Use cal_days_in_month() for the next month and save that number to a variable x
 2) If x >= current billing DOB, increment and be done
 3) DateTime::modify('last day')  (havent used this before but something along these lines) to set the date to the last date of the next month (set it to the 1st of the next month, then last day?)

ここで変数を新しい請求値として使用すると、元の値が消去されることに注意してください。「最初の請求日」または単に「billing_day_of_month」などの追加のDB値を保存し、それを使用して、確認する必要のある月の日を把握します。

于 2012-02-14T18:44:42.717 に答える
0

会員の月が短くなる(つまり、1月31日から1か月は2月28日/ 29日)ことを除いて、ユーザーフレンドリーな月単位で厳密に増やすことを目標としている場合(つまり、1月21日から3か月は4月21日である必要があります)、翌月に渡った場合は、数日戻るだけで済みます。

function addMonths($date,$months) {
  $orig_day = $date->format("d");
  $date->modify("+".$months." months");
  while ($date->format("d")<$orig_day && $date->format("d")<5)
    $date->modify("-1 day");
}

$d = new DateTime("2000-01-31");
addMonths($d,1);
echo $d->format("Y-m-d"); // 2000-02-29
于 2016-11-29T23:18:29.167 に答える