PHP Datum () mit Zeitzone?

78

Ich habe also die Liste der unterstützten Zeitzonen in PHP überprüft und mich gefragt, wie ich sie in die date()Funktion aufnehmen kann. Vielen Dank!

Ich möchte keine Standardzeitzone, jeder Benutzer hat seine Zeitzone in der Datenbank gespeichert. Ich nehme diese Zeitzone des Benutzers und verwende sie. Wie? Ich weiß, wie man es aus der Datenbank nimmt, nicht wie man es benutzt.

user2917204
quelle
In welchem ​​Format speichern Sie Zeitzonen?
Revo

Antworten:

134

Für eine solche Aufgabe sollten Sie wirklich die DateTime-Klasse von PHP verwenden. Bitte ignorieren Sie alle Antworten, die Ihnen empfehlen, date () oder date_set_time_zone zu verwenden. Es ist einfach schlecht und veraltet.

Ich werde Pseudocode verwenden, um zu demonstrieren, also versuchen Sie, den Code an Ihre Bedürfnisse anzupassen.

Angenommen, die Variable $ tz enthält den Zeichenfolgennamen einer gültigen Zeitzone und die Variable $ timestamp enthält den Zeitstempel, den Sie entsprechend der Zeitzone formatieren möchten, sieht der Code folgendermaßen aus:

$tz = 'Europe/London';
$timestamp = time();
$dt = new DateTime("now", new DateTimeZone($tz)); //first argument "must" be a string
$dt->setTimestamp($timestamp); //adjust the object to correct timestamp
echo $dt->format('d.m.Y, H:i:s');

Die DateTime-Klasse ist leistungsstark und um alle ihre Funktionen zu nutzen, sollten Sie einen Teil Ihrer Zeit damit verbringen, auf php.net darüber zu lesen. Um Ihre Frage vollständig zu beantworten - ja, Sie können den Zeitzonenparameter dynamisch anpassen (bei jeder Iteration beim Lesen aus der Datenbank können Sie ein neues DateTimeZone () -Objekt erstellen).

NB
quelle
1
@ Glavić - Sie haben Recht, ich lasse die Antwort in, um zu zeigen, wie man das nicht macht. DateTime schlägt jedoch die Manipulation der Zeitzone des Servers, worauf ich hinweisen wollte (aber nicht).
NB
Ihr Code funktioniert nicht, da der erste Parameter für den DateTime-Konstruktor eine Zeichenfolge sein muss [ php.net/manual/en/datetime.construct.php ]
Alex
@Alex - Ja, es ist falsch - das habe ich kommentiert und die Antwort belassen. Ich werde die Antwort so bearbeiten, dass sie den richtigen Konstruktor enthält, wenn ich mich nicht faul mache :) (in der Zwischenzeit können Sie die Antwort bearbeiten auch?)
NB
Warum setzen Sie den Zeitstempel jetzt auf den Zeitstempel, da Sie die DateTime bereits mit 'now' initiiert haben?
George Dimitriadis
@ GeorgeDimitriadis, weil es ein Beispiel für die Verwendung des Codes ist. Es dient der Hervorhebung , was Sie können tun. Sie sagen zu Recht, dass dies in diesem Fall im Grunde genommen sinnlos ist , aber ich habe es dort abgelegt, damit die Benutzer sehen können, wie ein Zeitstempel für ein erstelltes DateTimeObjekt geändert werden kann .
NB
38

Wenn ich richtig verstanden habe, müssen Sie zuerst die Zeitzone wie folgt einstellen:

date_default_timezone_set('UTC');

Und dann können Sie die Datumsfunktion verwenden:

// Prints something like: Monday 8th of August 2005 03:12:46 PM
echo date('l jS \of F Y h:i:s A');
Suresh Kamrushi
quelle
1
Ich möchte keine Standardzeitzone, sie wird für jeden Benutzer in einer Datenbank gespeichert.
user2917204
3
@ user2917204 Wenn Sie MySQL verwenden, speichern Sie es als TIMESTAMPDatentyp. Diese werden in UTC im Backend gespeichert, sodass sie in eine beliebige Zeitzone Ihrer Wahl konvertiert werden können.
Ceejayoz
Ich verwende MySQL und habe es als TIMESTAMP gespeichert. Welchen Code brauche ich, um es zu konvertieren?
user2917204
1
@ user2917204 Erstellen Sie eine Funktion, die die Zeitzone festlegt, das formatierte Datum ausspuckt und die Zeitzone zurücksetzt. Viele Beispiele stackoverflow.com/questions/11900126/… , stackoverflow.com/questions/7824038/… . Die DateTime-Klasse akzeptiert auch einen Zeitzonenparameter php.net/manual/en/class.datetime.php
Mike B
18

Verwenden Sie stattdessen die DateTime-Klasse , da sie Zeitzonen unterstützt. Das DateTime-Äquivalent von date()ist DateTime::format.

Ein äußerst hilfreicher Wrapper für DateTime ist Carbon - sehen Sie es sich auf jeden Fall an.

Sie möchten als UTC in der Datenbank speichern und auf Anwendungsebene konvertieren.

ceejayoz
quelle
Ja, kann es. Sie würden das in Ihrer Anwendungslogik mit den setTimezone()Funktionen dieser Klassen behandeln.
Ceejayoz
13

Die obige Antwort hat mich veranlasst, durch einige Reifen / Fallstricke zu springen, also habe ich einfach den saubereren Code gepostet, der für mich funktioniert hat:

$dt = new DateTime();
$dt->setTimezone(new DateTimeZone('America/New_York'));
$dt->setTimestamp(123456789);

echo $dt->format('F j, Y @ G:i');
Andrew
quelle
8

Es sollte so aussehen:

date_default_timezone_set('America/New_York');
user3049608
quelle
3
Ich möchte keine Standardzeitzone, jeder Benutzer hat seine Zeitzone in der Datenbank gespeichert. Ich nehme diese Zeitzone des Benutzers und verwende sie. Wie? Ich weiß, wie man es aus der Datenbank nimmt, nicht wie man es benutzt.
user2917204
Es wird nicht für alle Benutzer eine Standardzeitzone erstellt, sondern nur das aktuelle Skript, das vermutlich auf die Aktionen eines aktuellen Benutzers reagiert.
LStarky
3

das funktioniert 2019 perfekt:

date('Y-m-d H:i:s',strtotime($date. ' '.$timezone)); 
Emmanuel
quelle
2

Versuche dies. Sie können entweder einen Unix-Zeitstempel oder eine Datums- / Uhrzeitzeichenfolge übergeben

public static function convertToTimezone($timestamp, $fromTimezone, $toTimezone, $format='Y-m-d H:i:s') 
    {
        $datetime = is_numeric($timestamp) ?
                    DateTime::createFromFormat ('U' , $timestamp, new DateTimeZone($fromTimezone)) :
                    new DateTime($timestamp, new DateTimeZone($fromTimezone));

        $datetime->setTimezone(new DateTimeZone($toTimezone));

        return $datetime->format($format);
    }
dzona
quelle
2

Sie können einfach einen Zeitzonenunterschied zum Unix-Zeitstempel hinzufügen. Beispiel für Moskau (UTC + 3)

echo date('d.m.Y H:i:s', time() + 3 * 60 * 60);
Mike.Stanley
quelle
1

Ich habe diese sehr einfache Funktion erstellt und sie funktioniert wie ein Zauber:

function ts2time($timestamp,$timezone){ /* input: 1518404518,America/Los_Angeles */            
        $date = new DateTime(date("d F Y H:i:s",$timestamp));
        $date->setTimezone(new DateTimeZone($timezone));
        $rt=$date->format('M d, Y h:i:s a'); /* output: Feb 11, 2018 7:01:58 pm */
        return $rt;
    }
Shatadip Majumder
quelle
0

Oben nicht erwähnt. Sie können ein DateTime-Objekt auch erstellen, indem Sie im Konstruktor einen Zeitstempel als Zeichenfolge mit einem führenden @ -Zeichen angeben.

$dt = new DateTime('@123456789');
$dt->setTimezone(new DateTimeZone('America/New_York'));
echo $dt->format('F j, Y - G:i');

Weitere Informationen zu zusammengesetzten Formaten finden Sie in der Dokumentation: https://www.php.net/manual/en/datetime.formats.compound.php

Team EJ
quelle
-2

Sie können den Datenbankwert in der Funktion date_default_timezone_set, date_default_timezone_set (SOME_PHP_VARIABLE) ersetzen. muss sich aber nur um genaue Werte kümmern, die für die Zeitzonen relevant sind.

Yatin Trivedi
quelle