LoginSignup
2
2

More than 5 years have passed since last update.

DateTimeで「front of」「back of」とタイムゾーンを組み合わせた時の挙動にバグがある件

Last updated at Posted at 2015-03-04

検証

Windows7環境です。検証のために一時的にコンピュータ時刻とタイムゾーンを変更します。但し、差が開きすぎると自動同期できなくなるので、日付は現在のものをそのまま使うことにしています。

検証コード
<?php
date_default_timezone_set('UTC');
$list = [
    'now' => [
        'now' => null,
        'now Asia/Tokyo' => null,
        'Asia/Tokyo now' => null,
        'now +0900' => null,
        '+0900 now' => null,
    ],
    'next hour' => [
        'next hour' => null,
        'next hour Asia/Tokyo' => null,
        'Asia/Tokyo next hour' => null,
        'next hour +0900' => null,
        '+0900 next hour' => null,
    ],
    'front of 1' => [
        'front of 1' => null,
        'front of 1 Asia/Tokyo' => null,
        'Asia/Tokyo front of 1' => null,
        'front of 1 +0900' => null,
        '+0900 front of 1' => null,
    ],
    'back of 1' => [
        'back of 1' => null,
        'back of 1 Asia/Tokyo' => null,
        'Asia/Tokyo back of 1' => null,
        'back of 1 +0900' => null,
        '+0900 back of 1' => null,
    ],
];
exec('net start w32time');
exec('tzutil /s "UTC"');
exec('time 23:30:00');
array_walk_recursive($list, function (&$v, $k) {
    $v = (new \DateTime($k))->format('Y-m-d H:i:s e');
});
exec('tzutil /s "Tokyo Standard Time"');
exec('w32tm /resync');
exec('net stop w32time');
print_r($list);

2015/03/05現在の実行結果を示します。

実行結果
Array
(
    [now] => Array
        (
            # 基準となるUTCの現在日時です。
            [now] => 2015-03-04 23:30:00 UTC
            # タイムゾーン名の指定は、現在のタイムゾーンを上書きするだけでなく、実際に時刻を進めるようです。
            # これが仕様だとすれば正常です。
            [now Asia/Tokyo] => 2015-03-05 08:30:00 Asia/Tokyo
            # 順不同。正常です。
            [Asia/Tokyo now] => 2015-03-05 08:30:00 Asia/Tokyo
            # 時差での指定は、現在のタイムゾーンを上書きするだけのようです。
            # これが仕様だとすれば正常です。
            [now +0900] => 2015-03-04 23:30:00 +09:00
            # 順不同。正常です。
            [+0900 now] => 2015-03-04 23:30:00 +09:00
        )

    [next hour] => Array
        (
            # 最初より1時間進んでいます。正常です。
            [next hour] => 2015-03-05 00:30:00 UTC
            # 最初より1時間進んでいます。正常です。
            [next hour Asia/Tokyo] => 2015-03-05 09:30:00 Asia/Tokyo
            # 順不同。正常です。
            [Asia/Tokyo next hour] => 2015-03-05 09:30:00 Asia/Tokyo
            # 最初より1時間進んでいます。正常です。
            [next hour +0900] => 2015-03-05 00:30:00 +09:00
            # 順不同。正常です。
            [+0900 next hour] => 2015-03-05 00:30:00 +09:00
        )

    [front of 1] => Array
        (
            # 基準となった日の01時より15分前となっています。正常です。
            [front of 1] => 2015-03-04 00:45:00 UTC
            ###### 12時間の時差はどうやっても発生し得ないので、バグの可能性が高いと思われます。######
            [front of 1 Asia/Tokyo] => 2015-03-05 12:45:00 Asia/Tokyo
            # 基準となった日からAsia/Tokyo分だけ進めた日の01時より15分前となっています。正常です。
            [Asia/Tokyo front of 1] => 2015-03-05 00:45:00 Asia/Tokyo
            ###### 12時間の時差はどうやっても発生し得ないので、バグの可能性が高いと思われます。######
            [front of 1 +0900] => 2015-03-04 12:45:00 +09:00
            # 基準となった日の01時より15分前となっています。正常です。
            [+0900 front of 1] => 2015-03-04 00:45:00 +09:00
        )

    [back of 1] => Array
        (
            # 基準となった日の01時より15分後となっています。正常です。
            [back of 1] => 2015-03-04 01:15:00 UTC
            ###### 12時間の時差はどうやっても発生し得ないので、バグの可能性が高いと思われます。######
            [back of 1 Asia/Tokyo] => 2015-03-05 13:15:00 Asia/Tokyo
            # 基準となった日からAsia/Tokyo分だけ進めた日の01時より15分後となっています。正常です。
            [Asia/Tokyo back of 1] => 2015-03-05 01:15:00 Asia/Tokyo
            ###### 12時間の時差はどうやっても発生し得ないので、バグの可能性が高いと思われます。######
            [back of 1 +0900] => 2015-03-04 13:15:00 +09:00
            # 基準となった日の01時より15分後となっています。正常です。
            [+0900 back of 1] => 2015-03-04 01:15:00 +09:00
        )

)

ちなみに、タイムゾーン指定を第1引数の文字列から削除し、コンストラクタの第2引数で指定した場合は正しく動作します。

バグレポート

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2