DatePeriodは日付の期間を表し、『1月1日から3月31日まで、1日2時間34分56秒ごと』のような自力で書くとめんどくさい繰り返しを簡単に取り扱うことができるようになります。
val1:2013-01-01 00:00:00
val2:2013-01-01 00:01:00
val1:2013-01-01 00:00:01
val2:2013-01-01 00:01:01 // bug
val1:2013-01-01 00:00:02
val2:2013-01-01 00:01:01 // bug
$val2には0時1分0秒を指定したはずなのですが、何故か1秒おまけされてしまっているところがあります。
DatePeriodから取得したDateTimeに対してsetTimeするとおかしな値になるぞ、というバグです。
例では秒だからまだ気付かれにくいですが、'P1D'にすると1日ずれるのでわりかし事故です。
なんか開発中に日付が一日ずれてしまう問題に突き当たり、どう見てもソースは合ってるんだが何故だろうと延々悩んでいたら実はPHPのバグだったとかいう。
いやっほうバグを見つけてやったぜいと思ってたら、当然とうの昔に修正されている既知のバグでした。
ノートによると5.3.5では直っていたようです。
PHP5.4.7では正しく計算されるようになっていたのを確認しました。
PHPではしれっとこういうことがあったりするのが怖いですね。
<?php // 開始/終了日時 $start = new DateTime('2013-01-01 00:00:00', new DateTimeZone('Asia/Tokyo')); $finish = new DateTime('2013-01-01 00:00:03', new DateTimeZone('Asia/Tokyo')); // 1秒毎に分割 $dateInterval = new DateInterval('PT1S'); // 1秒 $datePeriod = new DatePeriod($start, $dateInterval, $finish); // 1秒ごとに実行 foreach($datePeriod as $key=>$val){ $val1 = clone $val; $val2 = clone $val; $val2->setTime(0, 1, 0); // $val2は0時1分0秒を指定する print( 'val1:' . $val1->format('Y-m-d H:i:s')); print( 'val2:' . $val2->format('Y-m-d H:i:s')); }
val1:2013-01-01 00:00:00
val2:2013-01-01 00:01:00
val1:2013-01-01 00:00:01
val2:2013-01-01 00:01:01 // bug
val1:2013-01-01 00:00:02
val2:2013-01-01 00:01:01 // bug
$val2には0時1分0秒を指定したはずなのですが、何故か1秒おまけされてしまっているところがあります。
DatePeriodから取得したDateTimeに対してsetTimeするとおかしな値になるぞ、というバグです。
例では秒だからまだ気付かれにくいですが、'P1D'にすると1日ずれるのでわりかし事故です。
なんか開発中に日付が一日ずれてしまう問題に突き当たり、どう見てもソースは合ってるんだが何故だろうと延々悩んでいたら実はPHPのバグだったとかいう。
いやっほうバグを見つけてやったぜいと思ってたら、当然とうの昔に修正されている既知のバグでした。
ノートによると5.3.5では直っていたようです。
PHP5.4.7では正しく計算されるようになっていたのを確認しました。
PHPではしれっとこういうことがあったりするのが怖いですね。
PR