2016-09-05 4 views
13

Ich habe ein Problem mit PHP DateDiff, ich verstehe nicht, warum jede Zeitzone unterschiedliche Ergebnisse zurückgibt, zum Beispiel in diesem Fall Prag 0 Monat und US 1 Monat zurück.DateDiff gibt unterschiedliche Ergebnisse für jeden Zeitbereich zurück

Was ist dieser Unterschied und wie ich 1 Monat zurückkomme (statt 30 Tage, wenn ich 1 Monat hinzufüge) wie erwartet?

Code Europe/Prag:

date_default_timezone_set("Europe/Prague"); 
$from = new \DateTimeImmutable('2016-09-01'); 
$to = $from->add(new \DateInterval('P1M')); 
var_dump($from); 
var_dump($to); 
var_dump($from->diff($to)->m); 
var_dump($from->diff($to)->d); 

Ergebnis Europe/Prag:

object(DateTimeImmutable)#1 (3) { 
    ["date"]=> 
    string(26) "2016-09-01 00:00:00.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(13) "Europe/Prague" 
} 
object(DateTimeImmutable)#3 (3) { 
    ["date"]=> 
    string(26) "2016-10-01 00:00:00.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(13) "Europe/Prague" 
} 
int(0) 
int(30) 

-

Code US/Pazifik:

date_default_timezone_set("US/Pacific"); 
$from = new \DateTimeImmutable('2016-09-01'); 
$to = $from->add(new \DateInterval('P1M')); 
var_dump($from); 
var_dump($to); 
var_dump($from->diff($to)->m); 
var_dump($from->diff($to)->d); 

führen US/Pazifik :

object(DateTimeImmutable)#2 (3) { 
    ["date"]=> 
    string(26) "2016-09-01 00:00:00.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(10) "US/Pacific" 
} 
object(DateTimeImmutable)#4 (3) { 
    ["date"]=> 
    string(26) "2016-10-01 00:00:00.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(10) "US/Pacific" 
} 
int(1) 
int(0) 
+0

Hätten Sie etwas dagegen 'var_dump'ing Stunden, Minuten, Sekunden und Millisekunden als auch? – Mchl

+0

Könnte das ein Fehler in PHP selbst sein? –

+0

@MichaelHirschler vielleicht, ich bin mir nicht sicher, deshalb habe ich meine Frage an SO gestellt – patie

Antwort

1

Dies ist in der Tat ein kleiner Fehler in der PHP DateTime-Klasse. Sie müssen die UTC Zeitzone verwenden und die gewünschte Zeitzone nach der Berechnung festgelegt:

date_default_timezone_set('UTC'); 

$europePrag = new DateTimeZone('Europe/Prague'); 
$usPacific = new DateTimeZone('US/Pacific'); 

$from = new \DateTimeImmutable('2016-11-01'); 
$to = $from->add(new \DateInterval('P1M')); 
$from->setTimezone($europePrag); 
var_dump($from); 
var_dump($to); 
var_dump($from->diff($to)->m); 
var_dump($from->diff($to)->d); 


$from = new \DateTimeImmutable('2016-11-01'); 
$to = $from->add(new \DateInterval('P1M')); 
$from->setTimezone($usPacific); 
var_dump($from); 
var_dump($to); 
var_dump($from->diff($to)->m); 
var_dump($from->diff($to)->d); 
Verwandte Themen