2016-09-09 4 views
1
$datetime = new DateTime(gmdate('Y-m-d H:i:s'), new DateTimeZone('UTC')); 
$past_time = $datetime->createFromFormat('Y-m-d H:i:s', $past_time)->getTimestamp(); 
echo 'Past formed: ' . gmdate('H:i:s', $past_time) . '<br><br>'; 

ausgibt:Warum ändert DateTime die Zeitzone in PHP?

2016-09-09 14:42:50 
Past formed: 12:42:50 


$past_time = $row->date_added; 

Wo Datum in einer MySQL-Datenbank hinzugefügt und ist gleich:

2016-09-09 14:42:50 

Ich bin nicht die Zeitzone zu ändern, ich bin Umwandlung nur einen Zeitstempel zurück in gmdate()

An welchem ​​Punkt ist die Zeit nach 2 Stunden und wie verhindere ich es?

bearbeiten

$datetime = new DateTime(gmdate('Y-m-d H:i:s'), new DateTimeZone('UTC')); 
$past_time = $datetime->createFromFormat('Y-m-d H:i:s', $past_time, new DateTimeZone('UTC'))->getTimestamp(); 
echo 'Past formed: ' . gmdate('H:i:s', $past_time) . '<br><br>'; 

Dies ist die Lösung war, hatte ich trotz der Zeitzone einstellen nie

Ändern Sie muss Sinn in einem Rund a-Kampf Art und Weise machen, aber ich noch don ‚t wirklich verstehen, wo Datetime wird immer seine‚von und zu‘

+0

Vielleicht aus dem ' 'U'', warum Sie es verwenden - vergessen diesen Kommentar – JustOnUnderMillions

+0

Ich habe versucht, getTimestamp(), aber das Ergebnis ist das gleiche – Lee

+0

Thing das ist das Problem:?' Gmdate() : Identisch mit der Funktion date(), außer dass die zurückgegebene Zeit die Greenwich Mean Time (GMT) ist. Verwenden Sie 'date()' anstelle von 'gmdate()' – JustOnUnderMillions

Antwort

1

2016-09-09 14:42:50 eingerichtet haben, ist ein unvollständig Zeitstempel, es der Zeitzone fehlt . Ohne Zeitzoneninformationen könnte sich dieser Zeitstempel auf einen von über 24 verschiedenen absoluten Punkten beziehen. 14:42:50 in London, England tritt einige Stunden nach 14:42:50 in Tokio, Japan auf.

DateTime Instanzen und UNIX-Zeitstempel (erstellt mit time() oder strtotime()) sind absolute Zeitpunkt, sie haben nicht und von Zeitzonen nicht beeinflusst werden. Wenn 2016-09-09 14:42:50 in einen dieser absoluten Zeitstempel umgewandelt wird, muss PHP die fehlende Information (die Zeitzone) von irgendwo herleiten. Wenn Sie die Information nicht explizit angeben, wird sie von date_default_timezone_get übernommen.

$datetime = new DateTime(gmdate('Y-m-d H:i:s'), new DateTimeZone('UTC')); 
$past_time = $datetime->createFromFormat('Y-m-d H:i:s', $past_time)->getTimestamp(); 

der Einfachheit halber hier loszuwerden, die völlig überflüssig $datetime Instanz erhalten Lassen Sie ...

$past_time = DateTime::createFromFormat('Y-m-d H:i:s', $past_time)->getTimestamp(); 

createFromFormat hier ist die unvollständige Zeitstempel zu lesen und folgert seine Zeitzone. Dort, wo die Diskrepanz auftritt, wird eine andere Zeitzone als die Zeitmarke angenommen. Daher ist das Ergebnis um einige Stunden verschoben. getTimestamp als nur formatiert das in einem anderen, aber immer noch, das Format eines UNIX-Zeitstempels.

echo 'Past formed: ' . gmdate('H:i:s', $past_time) . '<br><br>'; 

gmdate liest den UNIX-Zeitstempel und gibt sie an die GMT Zeitzone umgewandelt. date verwendet die date_default_timezone_get Zeitzone, gmdate verwendet immer GMT.

Sie haben hier eine Menge unnötiger Conversions. Das einzige, was Sie wirklich brauchen, ist:

$timestamp = DateTime::createFromFormat('Y-m-d H:i:s', $past_time, new DateTimeZone('UTC')); 
echo 'Past formed: ', $timestamp->format('H:i:s'); 
  1. dass Sie die richtige Zeitzone Informationen vervollständigen, wenn sie von 2016-09-09 14:42:50 zu einer DateTime Instanz konvertieren.
  2. Formatieren Sie die DateTime Instanz im gewünschten Format.
+0

Danke, ich habe etwas gelernt und Ihr Beitrag ist sehr detailliert, ich weiß Ihre Zeit zu schätzen – Lee

0

Sache ist die Frage, wenn Aufruf dieser Zeile:

echo 'Past formed: ' . gmdate('H:i:s', $past_time) . '<br><br>';

gmdate() sucht die aktuelle DateTimeZone in Ihrem PHP-Skript und handelt danach.

So müssen Sie diese zuerst für die globale Zeitzone verwenden:

date_default_timezone_set()

-Test, was Sie print date_default_timezone_get();

Verwandte Themen