PHP DateTime diff странный результат - PullRequest
2 голосов
/ 23 февраля 2012

У меня странная проблема с PHP-методом DateTime diff. Я уже некоторое время использую методы DateTime и подумал, что у меня есть навык, но эта проблема меня поражает.

Я использую метод diff, чтобы определить количество месяцев / дней между двумя датами. Сегодня я использовал следующий код:

$start = new DateTime('2012-03-01');
$end = new DateTime('2012-03-31');

$period = $start->diff($end);

var_dump($period);

Который дал следующий результат:

object(DateInterval)[3]
  public 'y' => int 0
  public 'm' => int 1 // Shouldn't this be 0?
  public 'd' => int 1 // And where does this come from? Would expect 30.
  public 'h' => int 0
  public 'i' => int 0
  public 's' => int 0
  public 'invert' => int 0
  public 'days' => int 30

Как сказано в моем комментарии выше, откуда, черт возьми, берется 1m1d (я бы ожидал 0m30d). Я не могу на всю жизнь понять, откуда он получает это значение. Я также попытался поместить метку полуночи 00:00:00 позади обеих дат, чтобы убедиться, что это не время, но это не имело никакого значения для вывода.

Кто-нибудь может объяснить мне этот результат? Эта проблема возникает на моем сервере разработки Debian с PHP 5.3.3 с установкой Xdebug 2.1.1 и Suhosin 0.9.32.1.

Обновление

Воспроизведена эта проблема на моем рабочем сервере, который находится на CentOS 6.0 с «сырым» PHP 5.3.8 без каких-либо расширений / исправлений.

Обновление 2

Мне удалось найти «обходной путь» (работает только в данный момент времени). Если я изменю абсолютные даты на:

$start = new DateTime('first day of next month');
$end = new DateTime('last day of next month');

Это дает 0m30d в качестве выхода. Тем не менее, я озадачен вышесказанным, поэтому, если у кого-то есть подсказка об этом, пожалуйста, дайте мне знать!

Ответы [ 3 ]

4 голосов
/ 23 февраля 2012

Поздравляю, вы только что обнаружили DST! Если вы проверите переключение DST для своего часового пояса, вы увидите, что $ start фактически получает 29 февраля, а $ end получает 30 марта. (2-3) = 1 (следовательно, m = 1) и (29-30) = 1 (следовательно, d = 1).

1 голос
/ 23 февраля 2012

Я не получаю тот же результат, что и вы, и мой результат на самом деле в порядке ...

object(DateInterval)#3 (8) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(30)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  int(30)
}

Это ненормально, чтобы получить 1 месяц, потому что нет ISNT даже месяц, хотя между двумя датами,1 месяц будет для

$start = new DateTime('2012-03-01');
$end = new DateTime('2012-04-01');

То, что я вижу здесь, может быть, у вас есть -1 день и 1 месяц вместо 30 дней, и вы думали, что видели 1 день 1 месяц, или код, который вы получили, не тот, чтоВы вставили сюда ...

Можете ли вы просветить нас?

Спасибо

0 голосов
/ 23 февраля 2012

Комментарии на этой странице (руководство по PHP), похоже, указывают на то, что функция может быть довольно глючной на определенных платформах или с определенными диапазонами ввода.

Это может быть причиной вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...