忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/10/17 14:46 |
PHP5.3.3 DatePeriodのバグ?
DatePeriodは日付の期間を表し、『1月1日から3月31日まで、1日2時間34分56秒ごと』のような自力で書くとめんどくさい繰り返しを簡単に取り扱うことができるようになります。

<?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


2013/08/16 23:32 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<買ったものリスト 2013/08/18 | HOME | PHP5.5.0 「第6回オフラインリアルタイムどう書くの参考問題」をPHPで解く>>
忍者ブログ[PR]