1

年と月の最初の日付とともに月のリストを生成しようとしています。

以下のコードを使用しますが、奇妙なことに 2 月が欠落しており、3 月が 2 回繰り返されています。

コード

        for ($i = 1; $i <= 12; $i++):

        $year='2013';

        $month_numb = date($year.'-m-01', mktime(0,0,0,$i));

        echo $month_numb.'<br>';

        endfor;

出力

2013-01-01
2013-03-01
2013-03-01
2013-04-01
2013-05-01
2013-06-01
2013-07-01
2013-08-01
2013-09-01
2013-10-01
2013-11-01
2013-12-01

なぜこれが起こっているのか、どうすれば修正できるのか誰か教えてもらえますか?

4

6 に答える 6

2

mktime() を呼び出す場合、デフォルトの日は現在の日 (今日の場合は 30 日) です。2 月 30 日は実際には 3 月 2 日なので (ほとんどの場合)、mktime(0,0, 0,2) は 3 月を返します。

月の日付を mktime に与えます。mktime(0,0,0,$i,1)。

于 2013-01-30T15:41:39.473 に答える
1

dateとなしでそれを行う方が良いのではないmktimeですか?

$year = 2013;
for ( $i = 1; $i <= 12; $i++ ) {
  $month_numb = $year . '-' . $i . '-01';
  echo $month_numb . '<br/>';
}
于 2013-01-30T15:37:10.617 に答える
0

DateTimeを使用します。それはもっと簡単です:

$datetime = new DateTime('2013-01-01');
for ($i = 1; $i <= 11; $i++)
{
    echo $datetime->format('Y-m-d') . "<br>\n";
    $datetime->modify('+1 month');
}

実際に見てください

于 2013-01-30T15:36:44.263 に答える
0

の 5 番目のパラメーターは、今日のmktime日に設定されます: (ドキュメントから: )、これは (1 月の) 30 です。2 月 30 日は存在しないので、3 月になります。... int $day = date("j") ...

2 月 1 日に正しく動作することがわかります。

于 2013-01-30T15:41:37.133 に答える