PHP DateTime 时差仅在 UTC 时区中正确?
PHP DateTime Timedifference only correct in UTC Timezone?
谁能解释一下我的以下行为:
$end = new DateTime("2015-03-01", new DateTimeZone("Europe/Berlin"));
$start = new DateTime("2015-02-01", new DateTimeZone("Europe/Berlin"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 0 [d] => 28 [h] => 0 [i] => 0 [s] => 0 [invert] => 0 [days] => 28 )
如果我不使用时区或 Europe/Berlin 我会得到错误的时差。 28 天确实是正确的,但在这种情况下是一个月。
$end = new DateTime("2015-03-01", new DateTimeZone("UTC"));
$start = new DateTime("2015-02-01", new DateTimeZone("UTC"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 1 [d] => 0 [h] => 0 [i] =>; 0 [s] => 0 [invert] => 0 [days] => 28 )
UTC 有效
$end = new DateTime("2015-04-01", new DateTimeZone("Europe/Berlin"));
$start = new DateTime("2015-03-01", new DateTimeZone("Europe/Berlin"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 1 [d] => 3 [h] => 0 [i] => 0 [s] => 0 [invert] => 0 [days] => 31 )
1 个月零 3 天?!?二月,你在这儿受惊了吗?
$end = new DateTime("2015-04-01", new DateTimeZone("UTC"));
$start = new DateTime("2015-03-01", new DateTimeZone("UTC"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 1 [d] => 0 [h] => 0 [i] =>; 0 [s] => 0 [invert] => 0 [days] => 31 )
31 天 = 1 个月,UTC 是正确的
$end = new DateTime("2015-05-01", new DateTimeZone("Europe/Berlin"));
$start = new DateTime("2015-04-01", new DateTimeZone("Europe/Berlin"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 0 [d] => 30 [h] => 0 [i] => 0 [s] => 0 [invert] => 0 [days] => 30 )
欧洲30天不也是一个月吗?
$end = new DateTime("2015-05-01", new DateTimeZone("UTC"));
$start = new DateTime("2015-04-01", new DateTimeZone("UTC"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 1 [d] => 0 [h] => 0 [i] =>; 0 [s] => 0 [invert] => 0 [days] => 30 )
UTC 正确
$end = new DateTime("2015-06-01", new DateTimeZone("Europe/Berlin"));
$start = new DateTime("2015-05-01", new DateTimeZone("Europe/Berlin"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 1 [d] => 1 [h] => 0 [i] => 0 [s] => 0 [invert] => 0 [days] => 31 )
又是31天,正确的是一个月,但为什么+1天?
$end = new DateTime("2015-06-01", new DateTimeZone("UTC"));
$start = new DateTime("2015-05-01", new DateTimeZone("UTC"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 1 [d] => 0 [h] => 0 [i] =>; 0 [s] => 0 [invert] => 0 [days] => 31 )
UTC 仍然正确
我不明白。感谢您的帮助。
我相信您遇到了一个已知错误。
参见:
谁能解释一下我的以下行为:
$end = new DateTime("2015-03-01", new DateTimeZone("Europe/Berlin"));
$start = new DateTime("2015-02-01", new DateTimeZone("Europe/Berlin"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 0 [d] => 28 [h] => 0 [i] => 0 [s] => 0 [invert] => 0 [days] => 28 )
如果我不使用时区或 Europe/Berlin 我会得到错误的时差。 28 天确实是正确的,但在这种情况下是一个月。
$end = new DateTime("2015-03-01", new DateTimeZone("UTC"));
$start = new DateTime("2015-02-01", new DateTimeZone("UTC"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 1 [d] => 0 [h] => 0 [i] =>; 0 [s] => 0 [invert] => 0 [days] => 28 )
UTC 有效
$end = new DateTime("2015-04-01", new DateTimeZone("Europe/Berlin"));
$start = new DateTime("2015-03-01", new DateTimeZone("Europe/Berlin"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 1 [d] => 3 [h] => 0 [i] => 0 [s] => 0 [invert] => 0 [days] => 31 )
1 个月零 3 天?!?二月,你在这儿受惊了吗?
$end = new DateTime("2015-04-01", new DateTimeZone("UTC"));
$start = new DateTime("2015-03-01", new DateTimeZone("UTC"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 1 [d] => 0 [h] => 0 [i] =>; 0 [s] => 0 [invert] => 0 [days] => 31 )
31 天 = 1 个月,UTC 是正确的
$end = new DateTime("2015-05-01", new DateTimeZone("Europe/Berlin"));
$start = new DateTime("2015-04-01", new DateTimeZone("Europe/Berlin"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 0 [d] => 30 [h] => 0 [i] => 0 [s] => 0 [invert] => 0 [days] => 30 )
欧洲30天不也是一个月吗?
$end = new DateTime("2015-05-01", new DateTimeZone("UTC"));
$start = new DateTime("2015-04-01", new DateTimeZone("UTC"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 1 [d] => 0 [h] => 0 [i] =>; 0 [s] => 0 [invert] => 0 [days] => 30 )
UTC 正确
$end = new DateTime("2015-06-01", new DateTimeZone("Europe/Berlin"));
$start = new DateTime("2015-05-01", new DateTimeZone("Europe/Berlin"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 1 [d] => 1 [h] => 0 [i] => 0 [s] => 0 [invert] => 0 [days] => 31 )
又是31天,正确的是一个月,但为什么+1天?
$end = new DateTime("2015-06-01", new DateTimeZone("UTC"));
$start = new DateTime("2015-05-01", new DateTimeZone("UTC"));
$diff = $start->diff($end);
//result: DateInterval Object ( [y] => 0 [m] => 1 [d] => 0 [h] => 0 [i] =>; 0 [s] => 0 [invert] => 0 [days] => 31 )
UTC 仍然正确
我不明白。感谢您的帮助。
我相信您遇到了一个已知错误。
参见: