4

過去 6 か月のリストが必要で、そのために次のコードを使用しています。

for ($i=6; $i >= 1; $i--) {
  array_push($months, date('M', strtotime('-'.$i.' Month')));
}

print_r($months);

次のように間違った出力が得られます

Array
(
    [0] => 'Dec'
    [1] => 'Dec'
    [2] => 'Jan'
    [3] => 'Mar'
    [4] => 'Mar'
    [5] => 'May'
)

それは違いない

Array
(
    [0] => 'Nov'
    [1] => 'Dec'
    [2] => 'Jan'
    [3] => 'Feb'
    [4] => 'Mar'
    [5] => 'Apr'
)

どこが間違っていますか。助けてください

4

3 に答える 3

10

月の最初の日から計算を開始する必要があります。

$first  = strtotime('first day this month');
$months = array();

for ($i = 6; $i >= 1; $i--) {
  array_push($months, date('M', strtotime("-$i month", $first)));
}

print_r($months);

/*
Array
(
    [0] => Nov
    [1] => Dec
    [2] => Jan
    [3] => Feb
    [4] => Mar
    [5] => Apr
)

*/
于 2012-05-31T07:06:10.537 に答える
4

そしていつものように、これを行うオブジェクトの方法を投稿しています:

$startDate = new DateTime('first day of this month - 6 months');
$endDate   = new DateTime('last month');
$interval  = new DateInterval('P1M'); // P1M => 1 month per iteration

$datePeriod = new DatePeriod($startDate, $interval, $endDate);

foreach($datePeriod as $dt) {
  array_push($months, $dt->format('M'));
}

/* output:
Array
(
   [0] => Nov
   [1] => Dec
   [2] => Jan
   [3] => Feb
   [4] => Mar
   [5] => Apr
)
*/

詳細については、 DateTimeDateInterval、およびDatePeriodを参照してください。

于 2012-05-31T07:17:34.470 に答える
0

これを使用してください:

date('M',strtotime('-'.$i.' Month', strtotime(date('Y-m-01'))))

理由: 今日は 5 月 31 日で、どの月も 31 日ではありません。実際、この (つまり +/- 月) 関数はあまり信頼できません。この出力が何であるかを推測できますか:

print(date('Y-M-d',strtotime('+1 Month', strtotime(date('2012-01-30'))))."\n");

?

于 2012-05-31T06:52:56.450 に答える