web-dev-qa-db-ger.com

php konvertiert datetime in UTC

Ich brauche eine einfache Möglichkeit, einen Datumszeitstempel in UTC zu konvertieren (unabhängig von der Zeitzone, in der sich der Server befindet) HOFFNLICH, ohne Bibliotheken zu verwenden.

76
Jeremey

Versuchen Sie die getTimezone und setTimezone , siehe das Beispiel

(Aber dies verwendet eine Klasse)

AKTUALISIEREN:

Ohne Unterricht könnten Sie so etwas versuchen:

$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

28
Phill Pafford

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

Beispiel

Wie gewünscht, hier ein einfaches Beispiel:

echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
98
poke

DateTime verwenden:

$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
55
joerx

So geht's:

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

oder einfach 

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

um "JETZT" in UTC zu erhalten.

Überprüfen Sie die Referenz:

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

19
Attilio

Wenn Sie ein Datum in diesem Format JJJJ-MM-HH dd: mm: ss, Haben, können Sie php tatsächlich täuschen, indem Sie am Ende Ihrer "datetime-Zeichenfolge" eine UTC-Zeichenfolge 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, kümmert es sich auch um das Problem der Sommerzeit.

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

13
Johan

Da strtotime ein bestimmtes Eingabeformat erfordert, könnte 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"));

Arbeitet alles MEIST der Zeit.

4
aorcsik

Konvertieren Sie die lokale Zeitzonenzeichenfolge in eine UTC-Zeichenfolge.
z.B. Neuseeland-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
    if $ 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
    if $ 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

3
Frank Hou

Ab PHP 5 können Sie die Funktion datetime :: format verwenden (siehe Dokumentation http: // us .php.net/manual/de/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
1
MUY Belgium

http://php.net/manual/de/function.strtotime.php oder wenn Sie keinen String, sondern Zeitkomponenten verwenden müssen, dann http://us.php.net/manual/ de/function.mktime.php

1
psychotik

Wenn Sie nichts dagegen haben, die seit PHP 5.2.0 verfügbare Klasse DateTime class von PHP zu verwenden, gibt es mehrere Szenarien, die in Ihre Situation passen könnten:

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

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
  2. Wenn Sie den ursprünglichen $givenDt spä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 nur eine Datetime-Zeichenfolge haben, z. $givenStr = '2018-12-17 10:47:12', dann erstellen Sie zuerst ein datetime-Objekt und konvertieren es dann. Beachten Sie, dass davon ausgegangen wird, dass sich $givenStr in der von PHP konfigurierten Zeitzone befindet.

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
    
  4. Wenn sich der angegebene datetime-String in einer anderen Zeitzone als der in Ihrer PHP -Konfiguration befindet, erstellen Sie das datetime-Objekt, indem Sie die korrekte Zeitzone angeben (siehe Liste der Zeitzonen PHP unterstützt ). 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
The Coprolal

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 ausgegeben: 

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

sie können dies im value-Attribut 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
Bruce Tong

Führen Sie die folgenden Schritte aus, um die UTC-Zeit von any Zeitzone im lokalen System des Benutzers zu erhalten (Dies ist für Webanwendungen erforderlich, um verschiedene Zeitzonen in UTC zu speichern):

  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)
    

versuchen 

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

wird ausgeben: 

19. Januar 2010

sie sollten die Formatierungszeit ändern, um andere Ausgaben anzuzeigen

0
StevieJ

Als Verbesserung an Phill Paffords Antwort (Ich habe sein 'Y-d-mTG: i: sz' nicht verstanden und er schlug vor, die Zeitzone zurückzusetzen). Deshalb schlage ich Folgendes vor (ich habe das HMTL-Format in Nur-Text geändert ...):

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

Allzweck-Normalisierungsfunktion zum Formatieren von Zeitstempeln in andere Zeitzonen. Sehr hilfreich zum Speichern von Datumszeitstempeln von Benutzern aus verschiedenen Zeitzonen in einer relationalen Datenbank. Für Datenbankvergleiche Zeitstempel als UTC speichern und mit gmdate('Y-m-d H:i:s') verwenden

/**
 * 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;
    }
}

Verwendungszweck:

$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
Sandeep