2016-08-07 3 views
2

Мне нужно использовать date_default_timezone_set для моего проекта, и все это работало нормально, пока я не начал использовать date_diff, поскольку он производит хорошие и ложные результаты в зависимости от выбранного часового пояса. Пример:date_default_timezone_set производит странные результаты, что дает?

date_default_timezone_set('America/Los_Angeles'); 

$first = date_create("2016-10-01"); 
$last = date_create("2016-10-31"); 
$diff = date_diff($first, $last); 
echo $diff->d; 

В результате 30, которым является правильным. Теперь, если я установить часовой пояс в Европу:

date_default_timezone_set('Europe/London'); 

Результат 0. Что происходит?

ответ

2

Если вы var_dump($diff) вы увидите, что дни была обнулена и месяц увеличивается до 1:

object(DateInterval)#3 (15) { 
    ["y"]=> 
    int(0) 
    ["m"]=> 
    int(1) 
    ["d"]=> 
    int(0) 
    ["h"]=> 
    int(0) 
    ["i"]=> 
    int(0) 
    ["s"]=> 
    int(0) 
    ["weekday"]=> 
    int(0) 
    ["weekday_behavior"]=> 
    int(0) 
    ["first_last_day_of"]=> 
    int(0) 
    ["invert"]=> 
    int(0) 
    ["days"]=> 
    int(30) 
    ["special_type"]=> 
    int(0) 
    ["special_amount"]=> 
    int(0) 
    ["have_weekday_relative"]=> 
    int(0) 
    ["have_special_relative"]=> 
    int(0) 
} 

Это, вероятно, связано с тем, что London switches back from DST on the last Sunday in October. Однако рассчитывается разница по дате, которая, по-видимому, делает ее «месяцем», а не 30 днями.

Вы можете преодолеть это, используя свойство dayswhich is will report 30:

$first = date_create("2016-10-01"); 
$last = date_create("2016-10-31"); 
$diff = date_diff($first, $last); 
echo $diff->days; 
+2

Обратите внимание, что 'days' свойство является 30 при использовании' Америка/Los_Angeles' или 'Европа/London'. Это может быть лучшим вариантом для ОП. – Chris

+0

Буду рад, если бы вы это сделали. – Chris

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