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.

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


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'));

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

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


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 .... :)


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


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);

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.


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'));



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


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"

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.


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)

-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"; 
?>

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.