Holen Sie sich UTC-Zeit in PHP

122

Wie kann ich mit der date () -Funktion von PHP einen UTC / GMT +/- Zeitstempel erhalten? Zum Beispiel, wenn ich es versuche

date("Y-m-d H:i:s", time()); 

Ich werde einen Unix-Zeitstempel erhalten. Ich muss jedoch einen UTC / GMT-Zeitstempel mit der Zeichenfolge GMT / UTC +/- 0400 oder GMT / UTC +/- 1000 basierend auf den lokalen Zeitangaben erhalten.

Robin Michael Poothurai
quelle
1
@JeffPuckettII GMT ändert sich nicht für die Sommerzeit. Großbritannien wechselt im Sommer von GMT zu BST, aber GMT bleibt gleich und entspricht immer UTC.
Lewis

Antworten:

111

Bei Verwendung gmdatewird immer ein GMT-Datum zurückgegeben. Die Syntax ist dieselbe wie für date.

nikc.org
quelle
12
@sanmai: Ein Unix-Zeitstempel ist per Definition immer UTC. en.wikipedia.org/wiki/Unix_time
nikc.org
1
@ nikc.org: Das Problem ist, dass gmdate ("U") dasselbe wie time () zurückgibt, was kein UTC-Zeitstempel ist, wenn die Zeitzone Ihres Serversystems unterschiedlich ist. Der einzige Weg , ich war in der Lage echten UTC läuft Zeitstempel zu bekommen war strtotime (gmdate ( "M d YH: i: s")), die anders ist , dass gmdate ( "U"), wenn die Server - System Zeitzone ist anders als UTC
Bksi
@bksi Ich kann Ihr beschriebenes Verhalten nicht wiederholen. (Mein Computer ist nicht auf GMT und meine UNIX-Zeitstempel sind korrekt. Außerdem gmdate("U") == time().) Klingt nach potenziell fehlerhaftem Verhalten. Überprüfen Sie den PHP-Projekt und melden Sie einen Fehler.
Nikc.org
Ich habe ein einfaches PHP-Skript verwendet, um das Szenario zu testen: <? Echozeit (). "===" .strtotime (gmdate ("M d YH: i: s")). "Zeitzone:" .date ("Z"). "\ n"; ?> Wenn ich es ausgeführt habe, erhalte ich dieses Ergebnis: 1456342082 === 1456338482 Zeitzone: 3600 Das Ergebnis des Shell-Befehlsdatums ist: Mi 24. Februar 20:28:11 MEZ 2016
bksi
1
@bksi - Vielleicht verwechseln Sie die interne Darstellung von datetime mit der externen Darstellung von datetime? Zeit ohne Zonenspezifizierer gegen Zeit mit einem Zonenspezifizierer? Wie nikc (und die Dokumentation) sagen, wird time()"Anzahl der Sekunden seit der Unix-Epoche (1. Januar 1970 00:00:00 GMT)" zurückgegeben. Hinweis GMT. Die Tatsache, dass Ihr System dies standardmäßig zur Anzeige in Ihre Zeitzone konvertiert , ist eine Benutzerfreundlichkeit. Intern ist es immer GMT.
ToolmakerSteve
90

Ein einfaches gmdate () wird ausreichen

<?php
print gmdate("Y-m-d\TH:i:s\Z");
Shankar Damodaran
quelle
47

Wie bereits hier beantwortet , können Sie seit PHP 5.2.0 die DateTimeKlasse verwenden und die UTC-Zeitzone mit einer Instanz von angeben DateTimeZone.

In der Dokumentation zu DateTime __construct () wird vorgeschlagen , "now" als ersten Parameter zu übergeben, wenn eine DateTime-Instanz erstellt und eine Zeitzone angegeben wird, um die aktuelle Zeit abzurufen.

$date_utc = new \DateTime("now", new \DateTimeZone("UTC"));

echo $date_utc->format(\DateTime::RFC850); # Saturday, 18-Apr-15 03:23:46 UTC
Jessedc
quelle
3
In der Dokumentation zu DateTime __construct () wird nicht mehr vorgeschlagen, den ersten Parameter wegzulassen, um die aktuelle Uhrzeit abzurufen. Es heißt jetzt, Sie sollten eine Zeichenfolge von "Jetzt" verwenden.
PaulSkinner
Danke @PaulSkinner, ich habe die Antwort geändert.
Jessedc
Danke, wozu dienen die Backslashes vorher DateTime? Wenn ich es selbst laufen lasse, scheint es ohne sie gut zu funktionieren.
Schnee
1
@Snow Wenn dieser Code in Code mit Namespace eingefügt wird, nehmen wir an, dass Ihre Datei oben eine namespace ADeklaration enthält, auf die PHP DateTimeverweist A\DateTime, was falsch ist. Das Hinzufügen des Backslash behebt das Problem. Es ist meiner Meinung nach eine gute Angewohnheit, auch wenn Sie noch keine Namespaces verwenden.
Niavlys
35
$time = time();
$check = $time+date("Z",$time);
echo strftime("%B %d, %Y @ %H:%M:%S UTC", $check);
Sudhir Bastakoti
quelle
3
@AlainTiemblo nicht ganz; Sie müssen den Versatz subtrahieren, damit er funktioniert
Sanmai
14
date("Y-m-d H:i:s", time() - date("Z"))
Allanrbo
quelle
14

UTC-Datum erhalten

gmdate("Y-m-d H:i:s");

UTC-Zeitstempel erhalten

time();

Das Ergebnis wird nicht anders sein, selbst wenn Sie date_default_timezone_setIhren Code haben.

StefansArya
quelle
@ زياد Danke für die Korrektur, ich habe meine Antwort geändert
StefansArya
Ich dachte, dass gmdate () GMT und nicht UTC zurückgibt. "Identisch mit der Funktion date (), außer dass die zurückgegebene Zeit Greenwich Mean Time (GMT) ist". Vermisse ich etwas Kommen diese gleichwertig heraus?
Jordanien
3
@ Jordan In der Praxis repräsentieren UTC und GMT die gleiche Zeit. stackoverflow.com/questions/48942916/…
Martti
12

Neben dem Aufrufen können gmdateSie diesen Code auch vor den Rest des Codes stellen:

<?php
date_default_timezone_set("UTC");
?>

Dadurch werden Ihre datums- / zeitbezogenen Anrufe zur Verwendung der GMT / UTC-Zeitzone ausgeführt.

Anubhava
quelle
Nicht mehr in den neuesten Versionen von PHP.
Khom Nazid
1
@KhomNazid "UTC" als Parameter ist weiterhin gültig. php.net/manual/en/…
Harikrishna
6

Sie können die Funktion gmmktime ohne Argumente verwenden, um den aktuellen UTC-Zeitstempel abzurufen :

$time = gmmktime();
echo date("Y-m-d H:i:s", $time); 

gmmktime funktioniert nur, wenn Ihre Serverzeit UTC verwendet. Zum Beispiel ist mein Server auf US / Pacific eingestellt. Die oben aufgeführte Funktion spiegelt die pazifische Zeit wider.

RicoRico
quelle
gmmktime () ist veraltet
Jonny
2

mit String GMT / UTC +/- 0400 oder GMT / UTC +/- 1000 basierend auf lokalen Timings

Ihr benutzerdefiniertes Format fehlt nur O, um Ihnen die Zeitzonenversätze zur Ortszeit anzuzeigen.

Unterschied zur Greenwich-Zeit (GMT) in Stunden Beispiel: +0200

date_default_timezone_set('America/La_Paz');
echo date('Y-m-d H:i:s O');

2018-01-12 12:10:11 -0400

Doch für maximierten Portabilität / Interoperabilität, würde ich mit dem empfehlen ISO8601 Datumsformatc

date_default_timezone_set('America/La_Paz');
echo date('c');

2018-01-12T12: 10: 11-04: 00

date_default_timezone_set('Australia/Brisbane');
echo date('c');

2018-01-13T02: 10: 11 + 10: 00

Sie können auch verwenden gmdateund die Zeitzonen-Offset-Zeichenfolge wird immer sein+00:00

date_default_timezone_set('America/La_Paz');
echo gmdate('c');

2018-01-12T16: 10: 11 + 00: 00

date_default_timezone_set('Australia/Brisbane');
echo gmdate('c');

2018-01-12T16: 10: 11 + 00: 00

Jeff Puckett
quelle
1

Sie können Folgendes verwenden, um die UTC-Zeit abzurufen:

date_default_timezone_set('Asia/Calcutta');

$current_date = date("Y/m/d g:i A");

$ist_date = DateTime::createFromFormat(
                        '"Y/m/d g:i A"',
                        $current_date,
                        new DateTimeZone('Asia/Calcutta')
                    );

$utc_date = clone $ist_date;
$utc_date->setTimeZone(new DateTimeZone('UTC'));

echo 'UTC:  ' . $utc_date->format('Y-m-d g:i A');
Dalip
quelle
0
/**
     * Converts a local Unix timestamp to GMT
     *
     * @param   int Unix timestamp
     * @return  int
     */
    function local_to_gmt($time = '')
    {
        if ($time === '')
        {
            $time = time();
        }

        return mktime(
            gmdate('G', $time),
            gmdate('i', $time),
            gmdate('s', $time),
            gmdate('n', $time),
            gmdate('j', $time),
            gmdate('Y', $time)
        );
    }
Realmag777
quelle
0

Unten finden Sie den PHP-Code, um die aktuelle UTC-Zeit (Coordinated Universal Time) abzurufen

<?php
// Prints the day
echo gmdate("l") . "<br>";

// Prints the day, date, month, year, time, AM or PM
echo gmdate("l jS \of F Y h:i:s A");
?>

Shivasagar
quelle