DateTime :: modify和DST开关

mpe*_*pen 5 php datetime

使用DateTime :: modify在DST边界上添加一小时会导致它跳过一个小时.

例如

$d = new DateTime('2015-11-01 12:00:00 AM', new DateTimeZone('America/Vancouver'));
$d->modify('+1 hour'); // 1 AM
$d->modify('+1 hour'); // 2 AM
$d->modify('+1 hour'); // 3 AM
Run Code Online (Sandbox Code Playgroud)

我希望看到"凌晨1点"两次(然后是 "凌晨2点"),因为时间可以追溯到一个小时.

我怎么能得到这种行为?

mpe*_*pen 2

这是一个错误。(信用

要解决此问题,请将时区更改为 UTC,然后再更改回来。

$d = new DateTime('2015-11-01 12:00:00 AM', new DateTimeZone('America/Vancouver'));

$tz = getTimezone();
$d->setTimezone(new DateTimeZone('UTC'));
$d->modify('+1 hour'); 
$d->modify('+1 hour'); 
$d->modify('+1 hour'); 
$d->setTimezone($tz);
echo $d->format('d-M-Y g:ia'); // 01-Nov-2015 2:00am
Run Code Online (Sandbox Code Playgroud)