PHP UTC zu Ortszeit

Lesezeit: 4 Minuten

Serverumgebung

Red Hat Enterprise Linux
PHP5.3.5

Problem

Angenommen, ich habe ein UTC-Datum und eine Uhrzeit wie 2011-04-27 02:45 und ich möchte es in meine Ortszeit umwandeln, die Amerika/New_York ist.

Drei Fragen:

1.) Mein Code unten könnte das Problem lösen, würden Sie zustimmen?

<?php

date_default_timezone_set('America/New_York');  // Set timezone.

$utc_ts = strtotime("2011-04-27 02:45");  // UTC Unix timestamp.

// Timezone offset in seconds. The offset for timezones west of UTC is always negative,
// and for those east of UTC is always positive.
$offset = date("Z");

$local_ts = $utc_ts + $offset;  // Local Unix timestamp. Add because $offset is negative.

$local_time = date("Y-m-d g:i A", $local_ts);  // Local time as yyyy-mm-dd h:m am/pm.

echo $local_time;  // 2011-04-26 10:45 PM

?>

2.) Aber passt sich der Wert von $offset automatisch an die Sommerzeit (DST) an?
3.) Wenn nicht, wie soll ich meinen Code so anpassen, dass er sich automatisch an die Sommerzeit anpasst?

Vielen Dank 🙂

  • date("Z") gibt immer die Zeitzone zurück GMT +0000die keine Korrektur für DST hat.

    – Marcel Korpel

    27. April 2011 um 15:37 Uhr

Benutzer-Avatar
Treffynnon

Dies wird tun, was Sie wollen, indem Sie PHPs native verwenden Terminzeit und DateTimeZone Klassen:

$utc_date = DateTime::createFromFormat(
                'Y-m-d G:i', 
                '2011-04-27 02:45', 
                new DateTimeZone('UTC')
);

$nyc_date = $utc_date;
$nyc_date->setTimeZone(new DateTimeZone('America/New_York'));

echo $nyc_date->format('Y-m-d g:i A'); // output: 2011-04-26 10:45 PM

Sehen DateTime::createFromFormat Manpage für mehr Informationen.

Nach einigen Experimenten zwischen Zeitzonen mit und ohne Sommerzeit Ich habe festgestellt, dass dies die Sommerzeit berücksichtigt. Dieselbe Konvertierung mit meiner obigen Methode ergibt dieselbe resultierende Zeit.

  • Das ist auch der Grund, warum PHP ungefähr 7 verschiedene Zeitzonen für den Bundesstaat Indiana hat, um all ihre verrückten unterschiedlichen DST-Regeln zu berücksichtigen: php.net/manual/en/timezones.php

    – Jimmy Sawczuk

    27. April 2011 um 16:28 Uhr

  • Alle: Ich schätze wirklich die Hilfe aller. Treffynnon: Danke! Ich werde es versuchen. Mein Code sieht im Vergleich zu deinem so primitiv aus, lol. War ich bei meinem Versuch überhaupt nah dran? Danke noch einmal!

    – John

    27. April 2011 um 16:35 Uhr


  • @John Freut mich, dass es dir gefällt. Ich bin mir bei Ihrem Code nicht sicher, da ich ihn noch nie so mit dem prozeduralen PHP-Stil geschrieben habe.

    – Treffynnon

    27. April 2011 um 16:39 Uhr

  • @Treffynnon Um Star Wars zu zitieren: Es ist ein älterer Code, aber überprüft.

    – Mr_Chimp

    30. September 2014 um 12:36 Uhr

Ich weiß, dass dies ein alter Beitrag ist, aber es gibt eine weitere Zeile, die Sie hinzufügen müssen, um die richtige Zeit zu erhalten.

Vor der Konvertierung in die Ortszeit müssen Sie die Standardzeitzone wie folgt auf UTC einstellen (wenn es sich um die Zeitzone der von Ihnen angegebenen Zeit handelt):

function GmtTimeToLocalTime($time) {
    date_default_timezone_set('UTC');
    $new_date = new DateTime($time);
    $new_date->setTimeZone(new DateTimeZone('America/New_York'));
    return $new_date->format("Y-m-d h:i:s");
}

date_default_timezone_set('America/New_York');  // Set timezone.
$utc_ts = strtotime("2011-04-27 02:45");  // UTC Unix timestamp.

Unmittelbar nach dieser Ausführung enthält $utc_ts die Ortszeit. PHP verarbeitet die Sommerzeit selbst.

=H=

  • Dadurch wird die Zeit zwischen Zeitzonen nicht konvertiert. Es erstellt nur einen neuen Unix-Zeitstempel für 2011-04-27 02:45. Die Zeitzone in Ihrem Beispiel macht in diesem Fall nichts und ist belanglos.

    – Treffynnon

    27. April 2011 um 15:56 Uhr


  • Es gibt keinen UTC-Zeitstempel, da der Zeitstempel nicht von der Zeitzone beeinflusst wird. Sie können jede Zeitzone in der ersten Zeile einstellen und $utc_ts gibt den gleichen Wert zurück. Dieser Code tut nichts anderes, als die Zeitzone für die zukünftige Verwendung im Skript festzulegen, er wirkt sich nicht auf den Zeitstempel selbst aus.

    – Wh1T3h4Ck5

    27. April 2011 um 17:06 Uhr

Ich werde die Antwort von Hasin Hayder verbessern

date_default_timezone_set('America/New_York');  // Set timezone.
$utc_ts = strtotime("2011-04-27 02:45 UTC");  // UTC Unix timestamp.
echo date('Y-m-d H:i:s a T', $utc_ts);

Es sollte ausgegeben werden

2011-04-26 10:45:00 pm EDT

Der Unterschied besteht darin, die Quellzeitzone hinzuzufügen. strtotime() akzeptiert auch die Zeitzone! :p

<?php
    $time = new DateTime('now', new DateTimeZone(date_default_timezone_get()));
    $timeZone = $time->format('P');//Asia/Kolkata ... GET TimeZone From PHP ini Setting
    $tm_datetime="08/08/2021 12:00 AM";
    $tm_tz_from = $timeZone;
    $tm_tz_to = 'UTC';
    $tm_format="Ymd\THis\Z";
    $dt = new DateTime($tm_datetime, new DateTimeZone($tm_tz_from));
    $dt->setTimeZone(new DateTimeZone($tm_tz_to));
    $utc_time_from =$dt->format("H:i:s");
    echo "UTC TIME".$utc_time_from;

?>

  • Bitte fügen Sie Ihrem Snippet eine Erklärung hinzu, damit es hilfreich ist

    – Weg

    9. August 2021 um 12:51 Uhr

  • Bitte fügen Sie Ihrem Snippet eine Erklärung hinzu, damit es nützlich ist

    – Weg

    9. August 2021 um 12:51 Uhr

1145780cookie-checkPHP UTC zu Ortszeit

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy