2013-10-10 3 views
0

Я использую DateTime и диф вычислить разницу в днях между двумя датами следующим образом:Datetime дифф возвращаются странный результат

$data_inceput = '2013-10-01'; 
$data_sfarsit = '2013-10-31'; 
$date1 = new DateTime($data_inceput); 
$date2 = new DateTime($data_sfarsit); 

$nr_zile = $date2->diff($date1)->format("%a"); 

$nr_zile выходит как 6015 по некоторым причинам.

Если я `var_dump($date2->diff($date1));

я получаю:

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

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

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

+0

Какую версию PHP вы используете? Я тестировал этот код на PHP 5.3.13 и не имел проблемы ($ nr_zile выходит как 30) –

+0

Проверка Lemme. Он также работает хорошо для меня на удаленном сервере, но дает мне приведенный выше результат на моем локальном сервере apache ... даже в php-настройках в основном одинаковые – Bogdan

+0

Установили ли часовой пояс UTC перед созданием экземпляров DateTime, используя 'date_default_timezone_set '? Если нет, пожалуйста, сделайте ... все равно: результат 'diff' довольно странный, но не могли бы вы сказать, в какой временной зоне вы находитесь, используя' date_default_timezone_get'? –

ответ

2

это проблема Windows, https://bugs.php.net/bug.php?id=51184

обновление до последней версии PHP или использовать любое альтернативное решение для этого.

+0

Да, это, кажется, проблема, и я не могу просто перейти на последнюю версию php. Думаю, мне придется изменить способ расчета расценок на дату. – Bogdan

1

Альтернативный способ вы можете использовать:

$data_inceput = strtotime('2013-10-01'); 
$data_sfarsit = strtotime('2013-10-31'); 
$daysBetween = round(($data_sfarsit - $data_inceput)/86400); 
+0

Я закончил тем, что использовал этот метод, даже если есть вероятность ошибки (главным образом, в отношении DST), но я не против, поскольку меня интересуют только дни, а не часы, и ошибка не является кумулятивной. – Bogdan

Смежные вопросы