PHP konvertieren datetime in UTC

88

Ich brauche eine einfache Möglichkeit, einen Datums- / Zeitstempel HOFFNUNGSFREI in UTC zu konvertieren (aus welcher Zeitzone sich der Server auch befindet), ohne Bibliotheken zu verwenden.

Jeremey
quelle

Antworten:

28

Probieren Sie getTimezone und setTimezone aus , siehe Beispiel

(Dies verwendet jedoch eine Klasse)

AKTUALISIEREN:

Ohne Unterricht könnten Sie so etwas ausprobieren:

$the_date = strtotime("2010-01-19 00:00:00");
echo(date_default_timezone_get() . "<br />");
echo(date("Y-d-mTG:i:sz",$the_date) . "<br />");
echo(date_default_timezone_set("UTC") . "<br />");
echo(date("Y-d-mTG:i:sz", $the_date) . "<br />");

HINWEIS: Möglicherweise müssen Sie auch die Zeitzone auf das Original zurücksetzen

Phill Pafford
quelle
54
Sie sollten nur verwenden, gmdateanstatt die Standardzeitzone auf UTC zu ändern. Weil gmdateautomatisch UTC verwendet.
stupsen
28
-1, weil Sie die globale Standardzeitzone dafür nicht ändern möchten. Es werden nur unbeabsichtigte Nebenwirkungen abgefragt.
Ward Bekker
@Phill Was ist 'sz' hier?
Shahid Karimi
2
Ich denke, es sollte "Ym-dTG ..." anstelle von "Yd-mTG ..." sein
Alex Angelico
Es funktioniert nicht für mich im Laravel-Projekt. Seine Rückkehr am selben Tag
Dharmender Tuli
108

Verwenden Sie strtotime , um einen Zeitstempel aus der angegebenen Zeichenfolge (interpretiert als Ortszeit) zu generieren, und verwenden Sie gmdate , um ihn als formatiertes UTC-Datum zurückzugewinnen.

Beispiel

Wie gewünscht, hier ein einfaches Beispiel:

echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
Sack
quelle
7
Ein kleines Beispiel vielleicht?
Cherouvim
2
@cherouvim Ich glaube nicht, dass es notwendig ist, aber ich habe trotzdem eines hinzugefügt ... Hoffe, es hilft.
stochern
5
gmdate () ist eine dieser PHP-Funktionen, auf die ich vor langer Zeit gerne gestoßen wäre. nl2br, jemand?
Charlie Schliesser
1
GMT und UTC sind nicht immer gleich.
Jay Sheth
1
@poke GMT respektiert die Sommerzeit, UTC nicht und deshalb wird es verwendet, damit Sie nichts anderes berücksichtigen müssen
Necro
67

Verwenden von DateTime:

$given = new DateTime("2014-12-12 14:18:00");
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 14:18:00 Asia/Bangkok

$given->setTimezone(new DateTimeZone("UTC"));
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 07:18:00 UTC
Joerx
quelle
Die Frage besagt, dass ein Zeitstempel in einen Zeitstempel konvertiert wird und DateTime keinen Zeitstempel als Eingabe akzeptiert. Sie müssten es irgendwie in einen String konvertieren und dann zurückkonvertieren.
Felwithe
20

Gehen Sie folgendermaßen vor:

gmdate('Y-m-d H:i:s', $timestamp)

oder einfach

gmdate('Y-m-d H:i:s')

um "JETZT" in UTC zu bekommen.

Überprüfen Sie die Referenz:

http://www.php.net/manual/en/function.gmdate.php

Attilio
quelle
14

Wenn Sie ein Datum in diesem Format haben JJJJ-MM-HH TT: MM: SS, können Sie PHP tatsächlich austricksen, indem Sie am Ende Ihrer "Datums- / Uhrzeit-Zeichenfolge" eine UTC hinzufügen und diese mit strtotime konvertieren.

date_default_timezone_set('Europe/Stockholm');
print date('Y-m-d H:i:s',strtotime("2009-01-01 12:00"." UTC"))."\n";
print date('Y-m-d H:i:s',strtotime("2009-06-01 12:00"." UTC"))."\n";

Dies wird dies drucken:

2009-01-01 13:00:00
2009-06-01 14:00:00

Und wie Sie sehen, wird auch das Problem der Sommerzeit behoben.

Ein etwas seltsamer Weg, um es zu lösen .... :)

Johan
quelle
Ich verstehe wirklich nicht, warum das OP Ihren Vorschlag nicht ausgewählt hat:D
php_nub_qq
@php_nub_qq wahrscheinlich, weil es funktioniert, indem die Zeitzone für das gesamte Skript geändert wird, was möglicherweise nicht erwünscht ist und unbeabsichtigte Konsequenzen haben kann.
Felwithe
@felwithe Es wäre nicht so, wenn Sie die erste Zeile überspringen würden, die nur zur Demonstration dient
php_nub_qq
10

Konvertieren Sie die lokale Zeitzonenzeichenfolge in eine UTC-Zeichenfolge.
zB neuseeländische Zeitzone

$datetime = "2016-02-01 00:00:01";
$given = new DateTime($datetime, new DateTimeZone("Pacific/Auckland"));
$given->setTimezone(new DateTimeZone("UTC"));
$output = $given->format("Y-m-d H:i:s"); 
echo ($output);
  • NZDT: UTC + 13: 00,
    wenn $ datetime = "2016-02-01 00:00:01", $ output = "2016-01-31 11:00:01";
    if $ datetime = "2016-02-29 23:59:59", $ output = "2016-02-29 10:59:59";
  • NZST: UTC + 12: 00,
    wenn $ datetime = "2016-05-01 00:00:01", $ output = "2016-04-30 12:00:01";
    if $ datetime = "2016-05-31 23:59:59", $ output = "2016-05-31 11:59:59";

https://en.wikipedia.org/wiki/Time_in_New_Zealand

Frank Hou
quelle
4

Da strtotime ein bestimmtes Eingabeformat erfordert, kann DateTime :: createFromFormat verwendet werden ( PHP 5.3+ ist erforderlich ).

// set timezone to user timezone
date_default_timezone_set($str_user_timezone);

// create date object using any given format
$date = DateTime::createFromFormat($str_user_dateformat, $str_user_datetime);

// convert given datetime to safe format for strtotime
$str_user_datetime = $date->format('Y-m-d H:i:s');

// convert to UTC
$str_UTC_datetime = gmdate($str_server_dateformat, strtotime($str_user_datetime));

// return timezone to server default
date_default_timezone_set($str_server_timezone);
Christos Pontikis
quelle
4

Ich benutze manchmal diese Methode:

// It is not importnat what timezone your system is set to.
// Get the UTC offset in seconds:
$offset = date("Z");

// Then subtract if from your original timestamp:
$utc_time = date("Y-m-d H:i:s", strtotime($original_time." -".$offset." Seconds"));

Funktioniert alle MOST der Zeit.

aorcsik
quelle
3
Zwei Probleme hier. Zuerst sollten Sie nicht subtrahieren, sondern den Offset addieren. Zweitens funktioniert dies nicht, wenn sich die lokale Zeitzone derzeit in der Sommerzeit befindet und das gewünschte Datum nicht in der Sommerzeit liegt. Der Offset würde um eine Stunde verschoben sein. Oder umgekehrt. Also ja, das funktioniert die meiste Zeit, aber nicht immer.
Ajon
4

Wenn es Ihnen nichts ausmacht, die DateTime- Klasse von PHP zu verwenden , die seit PHP 5.2.0 verfügbar ist, gibt es verschiedene Szenarien, die zu Ihrer Situation passen könnten:

  1. Wenn Sie ein $givenDtDateTime-Objekt haben, das Sie in UTC konvertieren möchten, wird es in UTC konvertiert:

    $givenDt->setTimezone(new DateTimeZone('UTC'));
  2. Wenn Sie das Original $givenDtspäter benötigen , können Sie alternativ das angegebene DateTime-Objekt klonen, bevor Sie das geklonte Objekt konvertieren:

    $utcDt = clone $givenDt;
    $utcDt->setTimezone(new DateTimeZone('UTC'));
  3. Wenn Sie beispielsweise nur eine datetime-Zeichenfolge haben, $givenStr = '2018-12-17 10:47:12'erstellen Sie zuerst ein datetime-Objekt und konvertieren es dann. Beachten Sie, dass dies $givenStrin der konfigurierten Zeitzone von PHP liegt.

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
  4. Wenn sich die angegebene Datums- / Uhrzeitzeichenfolge in einer anderen Zeitzone als in Ihrer PHP-Konfiguration befindet, erstellen Sie das Datums- / Uhrzeitobjekt, indem Sie die richtige Zeitzone angeben (siehe Liste der von PHP unterstützten Zeitzonen ). In diesem Beispiel nehmen wir die lokale Zeitzone in Amsterdam an:

    $givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
    $givenDt->setTimezone(new DateTimeZone('UTC'));
Der Coprolal
quelle
1

Mit PHP 5 oder höher können Sie die Funktion datetime :: format verwenden (siehe Dokumentation http://us.php.net/manual/en/datetime.format.php ).

 echo strftime( '%e %B %Y' , 
    date_create_from_format('Y-d-m G:i:s', '2012-04-05 11:55:21')->format('U')
    );  // 4 May 2012
MUY Belgien
quelle
0

Versuchen

Echodatum ('F d Y', Strtotime ('2010-01-19 00:00:00'));

wird ausgegeben:

19. Januar 2010

Sie sollten die Formatierungszeit ändern, um andere Ausgaben anzuzeigen

StevieJ
quelle
0

Allzweck-Normalisierungsfunktion zum Formatieren eines Zeitstempels von einer Zeitzone zu einer anderen. Sehr nützlich zum Speichern von Datenzeitstempeln von Benutzern aus verschiedenen Zeitzonen in einer relationalen Datenbank. Für Datenbankvergleiche speichern Sie den Zeitstempel als UTC und verwenden Sie ihn mitgmdate('Y-m-d H:i:s')

/**
 * Convert Datetime from any given olsonzone to other.
 * @return datetime in user specified format
 */

function datetimeconv($datetime, $from, $to)
{
    try {
        if ($from['localeFormat'] != 'Y-m-d H:i:s') {
            $datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Y-m-d H:i:s');
        }
        $datetime = new DateTime($datetime, new DateTimeZone($from['olsonZone']));
        $datetime->setTimeZone(new DateTimeZone($to['olsonZone']));
        return $datetime->format($to['localeFormat']);
    } catch (\Exception $e) {
        return null;
    }
}

Verwendung:

$from = ['localeFormat' => "d/m/Y H:i A", 'olsonZone' => 'Asia/Calcutta'];

$to = ['localeFormat' => "Y-m-d H:i:s", 'olsonZone' => 'UTC'];

datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"
Sandeep
quelle
0

Alternativ können Sie dies versuchen:

<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>

Dies wird Folgendes ausgeben:

2017-10-25 17:13:20 Asien / Singapur

Sie können dies innerhalb des value-Attributs eines Texteingabefelds verwenden, wenn Sie nur ein schreibgeschütztes Datum anzeigen möchten.

Entfernen Sie das 'e', ​​wenn Sie Ihre Region / Ihr Land nicht anzeigen möchten.

Bruce Tong
quelle
0

Führen Sie die folgenden Schritte aus, um die UTC-Zeit einer im lokalen System des Benutzers festgelegten Zeitzone abzurufen (dies ist erforderlich, damit Webanwendungen verschiedene Zeitzonen in UTC speichern können):

  1. Javascript (clientseitig):

    var dateVar = new Date();
    var offset = dateVar.getTimezoneOffset();
    //getTimezoneOffset - returns the timezone difference between UTC and Local Time
    document.cookie = "offset="+offset;
  2. PHP (serverseitig):

    public function convert_utc_time($date)
    {
        $time_difference = isset($_COOKIE['offset'])?$_COOKIE['offset']:'';
        if($time_difference != ''){
            $time = strtotime($date);
            $time = $time + ($time_difference*60); //minutes * 60 seconds
            $date = date("Y-m-d H:i:s", $time);
        } //on failure of js, default timezone is set as UTC below
        return $date;
    }
    ..
    ..
    //in my function
    $timezone = 'UTC';
    $date = $this->convert_utc_time($post_date); //$post_date('Y-m-d H:i:s')
    echo strtotime($date. ' '. $timezone)
Pradeep Kumar Prabaharan
quelle
-1

Als Verbesserung von Phill Paffords Antwort (ich verstand sein 'Yd-mTG: i: sz' nicht und er schlug vor, die Zeitzone zurückzusetzen). Also schlage ich Folgendes vor (ich habe es kompliziert, indem ich das HMTL-Format in Klartext geändert habe ...):

<?php
header('content-type: text/plain;');
$my_timestamp = strtotime("2010-01-19 00:00:00");

// stores timezone
$my_timezone = date_default_timezone_get();
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date)\n";

// changes timezone
date_default_timezone_set("UTC");
echo date("Y-m-d\TH:i:s\Z", $my_timestamp)."\t\t (ISO8601 UTC date)\n";
echo date("Y-m-d H:i:s", $my_timestamp)."\t\t (your UTC date)\n";

// reverts change
date_default_timezone_set($my_timezone);
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date is back)\n"; 
?>
7Tonin
quelle
2
Sie sollten Ihre Antwort bearbeiten, um zu erklären, wie sich die Antwort von Phil verbessert. Was haben Sie am Code geändert und warum ist es besser?
Cody Gray
Das Ändern der Standard-PHP-Zeitzone zum Konvertieren von zwei Zeitstempeln ist ein funktionierender Hack, aber keine elegante Lösung.
Der Coprolal