2016-06-16 5 views
3

私は奇妙なエラーを発見しました。そして、私は修正を求めていません、あなたが同じことを経験して、将来の参照のために残しておけば、私はちょうど興味があります。PHPと10月末

私は出力する必要があり、今年の毎日2016

$day = "2016-01-01"; 
for($i = 1; $i<= 365; $i++){ 
    $day = date("Y-m-d", strtotime($day)+60*60*24); 
    echo $day."<br/>";  
} 

次のコードを、持っている。しかし30-10-2016た後、それが増加して停止し、同じ日付が表示されます。

PHPのバージョンは5.6.22です。これは毎年だけでなく、2016年にも発生します。 何が原因でしょうか? これはこの特定のPHPバージョンには問題がありますか? これはタイムゾーンの問題ですか? あなたは同じ、またはそれに類するものを経験しましたか?

この問題の原因は何ですか? strtotime関数に何か問題があるようです。

+0

(PHPバージョン5.5.9) - 正しく動作し、すべての値 –

+0

をPHP 7.0で印刷すると、正常に動作します。 – Epodax

+1

このエラーは5.4.45で確認​​できます。 – cb0

答えて

3

は、日/週/月が予期しない結果が生じる可能性があります変更するには、タイムスタンプに秒を追加します。あなたのPHPがに設定されているタイムゾーン

$day = "2016-01-01"; 
for($i = 1; $i<= 365; $i++){ 
    $day = date("Y-m-d", strtotime("+ 1 day", strtotime($day))); 
    echo $day.PHP_EOL;  
} 

...一日を追加し、明示的に試してみてください、10月の終わりに夏時間の変更はありますか? - それは、日が25時間になる可能性があるため、日付を固執させます。

+0

私はすでにそれがタイムゾーンの問題であると疑っていました。 Ofcは夏時間です – chillichief

1

日付の生成にはPHP DateTime objectsの使用を強くお勧めします。数学を使って手続き型コードを生成するよりも簡単ですが、間隔を変更するなど、より詳細な制御が可能です(たとえば、毎日ではなく2日おきにするなど)。

DateTimeオブジェクトはPHP 5.2に含まれていたので、PHPのバージョンで正常に動作するはずです。

コード例:中

$start = new DateTime('2016-12-01'); 
$end = new DateTime('2016-12-31'); 

// Use this to add +1 day as the Interval goes _up to_ the date, 
// not inclusive of the date itself 
$end = $end->modify('+1 day'); 

// Set the interval to use, can be P2D if you'd like every 2 days. 
$interval = new DateInterval('P1D'); 

$dateRange = new DatePeriod($start, $interval, $end); 

foreach($dateRange as $date) { 
    echo $date->format('Y-m-d') . '<br />'; 
} 

結果:

2016-12-01 
2016-12-02 
... 
2016-12-30 
2016-12-31 
1

あなたのコードが動作しない理由を私は知りませんが、これは、このようなあなたのコードを再構築しようとすると、それは動作します:私は常に1月の最初から開始し、ここでは

$fday = "2016-01-01"; 
for($i = 1; $i<= 365; $i++){ 
    $day = date("Y-m-d", strtotime($fday)+(60*60*24)*$i); 
    echo $day."<br/>"; 
} 

をして時間を追加diffに$iを乗算して毎日の秒数を指定します。

この開始日を「30-10-2016」に設定すると、元のコードも機能しなくなるのは面白いことです。