2014-09-04 11 views
5

Wenn die PHP DateTime Klasse verwenden und versuchen, eine DateTimeZone einstellen ich unterschiedliche Ergebnisse, je nachdem wie ich stellte es: mit dem DateTime::__construct oder mit dem DateTime::setTimezone Methode.PHP Datetime-Zeitzonen - Constructor vs Setter-Methode

hier ein Beispiel:

$date = '2014-08-01' 

$dateTimeOne = new DateTime($date, new DateTimeZone('America/Los_Angeles')); 
echo $dateTimeOne->format('Y-m-d\TH:i:sP'); 
// 2014-08-01T00:00:00-07:00 

$dateTimeTwo = new DateTime($date); 
$dateTimeTwo->setTimezone(new DateTimeZone('America/Los_Angeles')); 
echo $dateTimeTwo->format('Y-m-d\TH:i:sP'); 
// 2014-07-31T17:00:00-07:00 

Siehe http://3v4l.org/LrZfM auch

Ich habe umsah und habe keine angemessene Erklärung dafür gefunden, dass dieses spezielles Verhalten außer dem folgenden Kommentar Adressen im php docs: datetime.settimezone und das Buch php|architect's Guide to Date and Time Programming: Dealing with Timezones - DateTimeZone.

Der Kommentar besagt, dass die DateTime::setTimezone Methode die Zeitzone für einen bestimmten Zeitpunkt (einen Zeitstempel) ändert, aber der Unix-Zeitstempel bleibt unverändert.

In der anderen Hand wird der DateTimeZone-Parameter DateTime::__construct10 verwendet, um die aktuelle Standardzeitzone mit einem benutzerdefinierten zu überschreiben .

Ansonsten gibt es nicht viel zum Thema (das ich finden konnte).

Dies ist, was würde ich gerne wissen:

die Zeitzonen
  • Eine weitere Erläuterung dieser beiden Möglichkeiten
  • einstellen Wann soll ich die DateTime::__construct verwenden, um die Zeitzone
  • einstellen Wenn ich die verwendet werden soll DateTime::setTimezone die Zeitzone
  • ein anschauliches Beispiel setzen eines der Verwendung gegen die anderen oder, wie sie in Verbindung zu verwenden
+2

Eine Zeitzone im Konstruktor bedeutet, dass "$ date" in dieser Zeitzone ist; Wenn Sie eine Zeitzone einstellen, verschiebt sich das Datum entsprechend der Differenz zwischen der Zeitzone bei der Konstruktion und der gegebenen Zeitzone. –

Antwort

1

Dies ist normales Verhalten.

Wenn Sie im Konstruktor nicht die Zeitzone angeben, wird die Standardzeitzone verwendet, d. H. Was mit date_default_timezone_set() festgelegt wurde.

Wenn Sie rufen:

$dateTimeTwo->setTimezone(new DateTimeZone('America/Los_Angeles')); 

Es bewegt sich die in der Standard-Zeitzone in die neue Zeitzone festgelegten Zeitpunkt.


1) (Konstruktor) festgelegten Zeitpunkt in 'America/Los_Angeles'
2) (Setter) festgelegten Zeitpunkt in Standard-Zeitzone, Umzugsdatum zu 'America/Los_Angeles'


Ihr Standard Zeitzone war wahrscheinlich UTC oder etwas in der Nähe. Du hast dem Computer gesagt, dass er 2014-08-01 um UTC setzen soll. Sie haben dann gebeten, in die Zeitzone "America/Los_Angeles" zu wechseln, die 7 Stunden früher ist, also das Datum auf 2014/07/31 um 17:00 Uhr geändert haben.