Eine Menge an Informationen und interssanter Ansätze fireweasel .
Achtung: kleine Textwand als echo -
Festzustellen, ob zwei Zeitzonen mit unterschiedlichen Bezeichnern (z.B. America/Havana und Cuba) praktisch für PHP die selbe Zeitzone sind, soweit wollte ich gar nicht gehen.
Praktisch die selbe Zeitzone bedeutet für mich das alle erdenklichen Rechenoperationen mit DateTime zu allen möglichen Zeiten für beide Zeitzonen immer identische Ergebnisse liefern.
Ich stimme dir zu, das geht wohl nur mit Hilfe der Transitions-Liste. Hier mein Versuch:
Ergebnis:
Europe/Berlin <> Europe/Amsterdam
Europe/Berlin <> Europe/Paris
Europe/Monaco <> Europe/Paris
Europe/Berlin == Europe/Berlin
Europe/San_Marino == Europe/Rome
Europe/Vatican == Europe/Rome
America/Havana == Cuba
Nun nochmal zurück zur Problematik bei einem Unit-Test.
Bei einen solchen Test kenne ich den Wert der als Resultat erwartet wird. Wenn das Resultat ein Objekt oder gar ein Array aus Objekten ist, kann nicht mit === verglichen werden. Die Empfehlung
gilt für skalare Variablen, nicht aber für Objekte. Variablen die Objekte enhalten mit === zu vergleichen führt nur zum Erfolg wenn die Variablen die selbe Instanz des Objektes enthalten. Den Erwartungswert welchen ich mit dem Resultat vergleichen möchte kann aber nur eine andere Instanz des Objektes sein. Dafür ist json_encode oder besser noch serialisize für einen Unit-test genau das was ich brauche.
Meine Überlegung geht in die Richtung für Objekte eine speziellen Vergleich in die Testklasse zu implementieren, um ein Zerpflücken der Objekte und ein Vergleich der Komponenten zu umgehen.
Achtung: kleine Textwand als echo -
Festzustellen, ob zwei Zeitzonen mit unterschiedlichen Bezeichnern (z.B. America/Havana und Cuba) praktisch für PHP die selbe Zeitzone sind, soweit wollte ich gar nicht gehen.
Praktisch die selbe Zeitzone bedeutet für mich das alle erdenklichen Rechenoperationen mit DateTime zu allen möglichen Zeiten für beide Zeitzonen immer identische Ergebnisse liefern.
Ich stimme dir zu, das geht wohl nur mit Hilfe der Transitions-Liste. Hier mein Versuch:
PHP-Code:
function isSameTimeZone(DateTimeZone $tz1,DateTimeZone $tz2){
$wTime = date_create("2000-1-1");
if($tz1->getOffset($wTime) !== $tz2->getOffset($wTime)) return false;
$sTime = date_create("2000-6-1");
if($tz1->getOffset($sTime) !== $tz2->getOffset($sTime)) return false;
return ($tz1->getTransitions() === $tz2->getTransitions());
}
$data = [
["Europe/Berlin","Europe/Amsterdam"],
["Europe/Berlin","Europe/Paris"],
["Europe/Monaco","Europe/Paris"],
["Europe/Berlin","Europe/Berlin"],
["Europe/San_Marino","Europe/Rome"],
["Europe/Vatican","Europe/Rome"],
["America/Havana","Cuba"],
];
foreach($data as $cmpData){
$tz0 = new DateTimeZone($cmpData[0]);
$tz1 = new DateTimeZone($cmpData[1]);
$cmp = isSameTimeZone($tz0, $tz1);
echo $cmpData[0].($cmp ? " == " : " <> "). $cmpData[1]."<br>\n";
}
Europe/Berlin <> Europe/Amsterdam
Europe/Berlin <> Europe/Paris
Europe/Monaco <> Europe/Paris
Europe/Berlin == Europe/Berlin
Europe/San_Marino == Europe/Rome
Europe/Vatican == Europe/Rome
America/Havana == Cuba
Nun nochmal zurück zur Problematik bei einem Unit-Test.
Bei einen solchen Test kenne ich den Wert der als Resultat erwartet wird. Wenn das Resultat ein Objekt oder gar ein Array aus Objekten ist, kann nicht mit === verglichen werden. Die Empfehlung
Deswegen vergleicht der vorsichtige PHP-Schrauber niemals mit zu wenigen Gleichheitszeichen!
Meine Überlegung geht in die Richtung für Objekte eine speziellen Vergleich in die Testklasse zu implementieren, um ein Zerpflücken der Objekte und ein Vergleich der Komponenten zu umgehen.
Kommentar