I have a simple variable that adds one month to today:
$endOfCycle = date("Y-m", strtotime("+1 month"));
Today is January 2013, so I would expect to get back 2013-02 but I'm getting 2013-03 instead. I can't figure out why it's jumping to March.
今日は 1 月 29 日であるため、3 月にジャンプします。1 か月を追加すると 2 月 29 日になりますが、これは存在しないため、次の有効な日付に移動します。
これは多くの月の 31 日にも発生しますが、1 月から 2 月の場合は 2 月の方が短いため、明らかに顕著です。
日付に関心がなく、単に翌月を指定したい場合は、入力日を当月の最初として指定する必要があります。月を追加すると、常に正しい答えが得られます。
同じ理由で、常に翌月の最終日を取得したい場合は、必要な月の翌月の最初の日を計算し、1 日を引くことから始めます。
これは
$endOfCycle=date('Y-m-d', strtotime("+30 days"));
strtotime
は、米国英語の日付形式を含む文字列が与えられることを期待し、その形式を Unix タイムスタンプ (1970 年 1 月 1 日 00:00:00 UTC からの秒数) に解析しようとします。 now が指定されていない場合は現在の時刻。
その間
date
指定された整数のタイムスタンプまたはタイムスタンプが指定されていない場合は現在の時刻を使用して、指定されたフォーマット文字列に従ってフォーマットされた文字列を返します。
以下のマニュアルページを参照してください。
このコードを使用して、次の月を取得できます。
$ts = mktime(0, 0, 0, date("n") + 1, 1);
echo date("Y-m-d H:i:s", $ts);
echo date("n", $ts);
今日が2013-01-31 01:23:45
上記であると仮定すると、次のようになります。
2013-02-01 00:00:00
2
今日は 1 月 29 日、+1 か月は 2 月 29 日を意味しますが、今年は 2 月が 28 日なので、次の日である 3 月 1 日と重なります。
代わりに試してください
strtotime('next month')
たぶん、2013-01-29 なので +1 月は 2013-02-29 になり、存在しないので 2013-03-01 になります
あなたは試すことができます
date('m/d/y h:i a',(strtotime('next month',strtotime(date('m/01/y')))));
$endOfCycle = date("Y-m", mktime(0, 0, 0, date("m", time())+1 , 15, date("m", time())));
これを試して:
$endOfCycle = date("Y-m", time()+2592000);
これにより、正確に 1 か月ではなく、30 日が追加されます。