忍者ブログ
[PR]
×

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



2017/07/23 19:49 |
DateTime::getTimestamp()すると日付が変わる件
<?php
	$date = new DateTime('2014/01/01 00:00:00', new DateTimeZone('Asia/Tokyo'));
	$date->modify('first day of -1 second');
	
	var_dump($date->format('Y-m-d H:i:s')); // 2013-12-31 23:59:59
	var_dump($date->getTimestamp()); // 1385909999 → 2013-12-01 23:59:59
	var_dump($date->format('Y-m-d H:i:s')); // 2013-12-01 23:59:59
何故か日付が変わっています。
なんだこれ。

更に深刻なことにはDateTimeImmutableでも発生します。
<?php
	$date = new DateTimeImmutable('2014/01/01 00:00:00');
	$date2 = $date->modify('first day of -1 second');
	var_dump($date2->format('Y-m-d H:i:s')); // 2013-12-31 23:59:59
	var_dump($date2->getTimestamp()); // 1385909999 → 2013-12-01 23:59:59
	var_dump($date2->format('Y-m-d H:i:s')); // 2013-12-01 23:59:59
あかんこれ。

ポイントは'first day of -1 second'と複数の変更を一気に指定するところです。
    $date->modify('first day of');
    $date->modify('-1 second');
と分けて記述すると何故か発生しません。

また'-1 minute'や'-1 hour'では発生しますが'-1 day'や'+1 second'は正常に計算されます。
'first Saturday of next month -1 second'や'Monday next week -1 second'などでも発生しません。
'first day'や'last day'と一日以下のマイナス計算が入っているとバグる模様。

カレンダーを作ったときに見つけたのですが、意味がわからなかったので放置していたところ、先日バグレポートが上がっていました。
せっかくだから報告でもしてみればよかったかな。

このバグは、PHP5.6RC2の時点ではまだ修正されていません。
DateTime関連は何気にバグやバグだかなんだかわからない挙動があったりするので、使うときは気をつけないといけませんね。

PR


2014/07/28 21:33 | Comments(0) | PHP

コメント

コメントを投稿する






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



<<POH Lite 20万人月プロジェクト | HOME | 買ったものリスト 2014/07/27>>
忍者ブログ[PR]