2016-08-07 79 views
2

Ich brauche date_default_timezone_set für mein Projekt und alles hat gut funktioniert, bis ich date_diff benutze, da es gute und falsche Ergebnisse produziert, abhängig von der gewählten Zeitzone. Ein Beispiel:date_default_timezone_set produziert seltsame Ergebnisse, was gibt?

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; 

Das Ergebnis ist 30, wich ist richtig. Wenn ich jetzt die Zeitzone auf Europa gesetzt:

date_default_timezone_set('Europe/London'); 

Das Ergebnis ist 0. Was ist los?

Antwort

2

Wenn Sie var_dump($diff) Sie werden sehen, dass die Tage auf Null und Monat zurückgestellt wurde erhöht auf 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) 
} 

Dies ist wahrscheinlich auf die Tatsache zurückzuführen ist, dass London switches back from DST on the last Sunday in October. Es wird jedoch der Datumsunterschied berechnet, der es scheinbar zu einem "Monat" im Gegensatz zu 30 Tagen macht.

Sie können dies überwinden, indem die days Eigenschaft mit which 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

Beachten Sie, dass die 'days' Eigenschaft 30 ist bei der Verwendung von' America/Los_Angeles' oder 'Europe/London'. Das könnte eine bessere Option für das OP sein. – Chris

+0

Ich würde mich freuen, wenn Sie es taten. – Chris