検証
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引数で指定した場合は正しく動作します。
バグレポート
- 今回検証したバグ - #69186 Unexpected behavior using 'back of' or 'front of' with timezone specification
-
front of
back of
の翻訳ミス - #69185 'back of' and 'front of' are reversely translated