Во время игры с PHP я поразил это:
<?php $FebruaryTheFirst = \DateTime::createFromFormat('Ymd H:i:s', '2001-02-01 00:00:00'); $MarchTheSecond = \DateTime::createFromFormat('Ymd H:i:s', '2001-03-01 00:00:00'); $interval = $FebruaryTheFirst->diff($MarchTheSecond); echo $interval->m.PHP_EOL; // Outputs 0. WTF? $FebruaryTheFirstbis = \DateTime::createFromFormat('Ym-d', '2001-02-01'); $MarchTheSecondbis = \DateTime::createFromFormat('Ym-d', '2001-03-01'); $interval2 = $FebruaryTheFirstbis->diff($MarchTheSecondbis); echo $interval2->m.PHP_EOL; // Outputs 1. WTF? $FebruaryTheFirstter = \DateTime::createFromFormat('Ymd H:i:s', '2001-02-01 00:01:00'); $MarchTheSecondter = \DateTime::createFromFormat('Ymd H:i:s', '2001-03-02 00:01:00'); $interval3 = $FebruaryTheFirstter->diff($MarchTheSecondter); echo $interval3->m.PHP_EOL; // Outputs 0. WTF? $FebruaryTheFirstfour = \DateTime::createFromFormat('Ymd H:i:s', '2001-02-01 01:00:00'); $MarchTheSecondfour = \DateTime::createFromFormat('Ymd H:i:s', '2001-03-02 01:00:00'); $interval4 = $FebruaryTheFirstfour->diff($MarchTheSecondfour); echo $interval4->m.PHP_EOL; // Outputs 1. WTF?
Я всегда должен получать 1
как результат, так как я всегда рассчитываю количество месяцев между Februar, 1-го и 1-го марта. Но, как показано выше, я также получаю 0
=> WTF?
Для информации моя версия php
PHP 5.3.8 (cli) (built: Jan 12 2012 19:12:32) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies with Xdebug v2.1.1, Copyright (c) 2002-2011, by Derick Rethans
Похоже, это известная ошибка в PHP. Посмотрите отчет об ошибке . Единственный способ исправить это, по крайней мере на данный момент, – это работать в UTC, чтобы устранить проблемы локального часового пояса.
Пример:
// Get the current timezone. $originalTimezone = @date_default_timezone_get(); // Work in UTC. date_default_timezone_set('UTC'); // ... $dateStart = new DateTime('2001-02-01'); $dateEnd = new DateTime('2001-03-01'); $interval = $dateStart->diff($dateEnd); // Reset the timezone. if ($originalTimezone) { date_default_timezone_set($originalTimezone); }