0

重複の可能性:
PHP の date() と strtotime() が 31 日に間違った月を返す

私はこのコードを持っていて、私が思うに奇妙なものを出力します。だから、私がここで間違っていること。

<?php 
$sP1 = date('m Y');
$sP2 = date('m Y', strtotime('+01 month'));
$sP3 = date('m Y', strtotime('+02 month'));
$sP4 = date('m Y', strtotime('+03 month'));
echo $sP1.'<br>';
echo $sP2.'<br>';
echo $sP3.'<br>';
echo $sP4.'<br>';
?>

そして、これは出力します

05 2012
07 2012
07 2012
08 2012

私は2番目のものであるべきだと思います

06 2012

誰でも解決策を知っていますか?

4

3 に答える 3

2

今日が31日で来月は30日しかないので今日から1ヶ月で7/12

assuming that today is May 31 2012

date('m Y') == 05 2012
date('m Y', strtotime('+1 month')) == 07 2012 because june has 30 days
date('m Y', strtotime('+2 month')) == 07 2012
date('m Y', strtotime('+3 month')) == 08 2012
date('m Y', strtotime('+4 month')) == 10 2012

毎月取得する必要がある何かをしている場合は、今日の日付を取得して月の最初の日を見つけ、それに月を追加します

于 2012-05-31T17:30:24.603 に答える
2

他の人が言ったように、今日が 31 日で、+1 か月が 6 月 31 日から 7 月 1 日になるからです。日付文字列に日を含めると、まさにこれがわかります。

<?php 
$sP1 = date('m-d-Y');
$sP2 = date('m-d-Y', strtotime('+01 month'));
$sP3 = date('m-d-Y', strtotime('+02 month'));
$sP4 = date('m-d-Y', strtotime('+03 month'));
echo $sP1."\n";
echo $sP2."\n";
echo $sP3."\n";
echo $sP4."\n";
/* Outputs:
    05-31-2012
    07-01-2012
    07-31-2012
    08-31-2012
*/
?>

ただし、strtotime は開始日を文字列の一部として使用できるため、King が提案したように、最初から +N か月を計算します。したがって、次のような文字列ですMay-1-2012 +01 month

<?php
$sP1 = date('m Y');
$sP2 = date('m Y', strtotime(date('M-1-Y').' +01 month'));
$sP3 = date('m Y', strtotime(date('M-1-Y').' +02 month'));
$sP4 = date('m Y', strtotime(date('M-1-Y').' +03 month'));
echo $sP1."\n";
echo $sP2."\n";
echo $sP3."\n";
echo $sP4."\n";
/* Outputs:
    05 2012
    06 2012
    07 2012
    08 2012
*/
?>

http://codepad.org/auYLHvDI

于 2012-05-31T17:47:01.323 に答える
1

意図したとおりに動作しています。一言で言えば、5月31日からの「1ヶ月」とは何か?6月30日?8月1日?

私の提案は、連続する月が必要な場合は、現在の日ではなく、現在の月の初めからのオフセットを計算することです。または、分割された月、日、および年の部分を使用して、探している日付を手動で構成します。

于 2012-05-31T17:33:15.970 に答える