Aktuelles Datum abrufen, gegebene Zeitzone in PHP?

75

Ich möchte das heutige Datum in einer Zeitzone im Paul Eggert-Format ( America/New_York) in PHP erhalten.

einstein
quelle
Sie sollten auf jeden Fall die Antwort von DesignerGuy akzeptieren oder den Titel Ihrer Frage in "Standardzeitzone festlegen" ändern ...
Axel
1
@Axel Done, ich bin kein PHP-Entwickler mehr, aber ich hoffe, es hilft.
Einstein
Gut gemacht! Es war die richtige Entscheidung IMHO ...
Axel

Antworten:

191

Die anderen Antworten legen die Zeitzone für alle Daten in Ihrem System fest. Dies funktioniert nicht immer gut, wenn Sie mehrere Zeitzonen für Ihre Benutzer unterstützen möchten.

Hier ist die Kurzversion:

<?php
$date = new DateTime("now", new DateTimeZone('America/New_York') );
echo $date->format('Y-m-d H:i:s');

Funktioniert in PHP> = 5.2.0

Liste der unterstützten Zeitzonen: php.net/manual/en/timezones.php


Hier ist eine Version mit einer vorhandenen Zeit und einer Zeitzone durch eine Benutzereinstellung

<?php

$usersTimezone = 'America/New_York';
$date = new DateTime( 'Thu, 31 Mar 2011 02:05:59 GMT', new DateTimeZone($usersTimezone) );
echo $date->format('Y-m-d H:i:s');

Hier ist eine ausführlichere Version, um den Prozess etwas klarer darzustellen

<?php

// Date for a specific date/time:
$date = new DateTime('Thu, 31 Mar 2011 02:05:59 GMT');

// Output date (as-is)
echo $date->format('l, F j Y g:i:s A');     

// Output line break (for testing)
echo "\n<br />\n";

// Example user timezone (to show it can be used dynamically)
$usersTimezone = 'America/New_York';

// Convert timezone
$tz = new DateTimeZone($usersTimezone);
$date->setTimeZone($tz);

// Output date after 
echo $date->format('l, F j Y g:i:s A');

Bibliotheken

  • Carbon - Eine sehr beliebte Datumsbibliothek.
  • Chronos - Ein Ersatz für Carbon, der sich auf Unveränderlichkeit konzentriert. Sehen Sie unten, warum das wichtig ist.
  • jenssegers / date - Eine Erweiterung von Carbon, die mehrsprachige Unterstützung bietet .

Ich bin mir sicher, dass es eine Reihe anderer Bibliotheken gibt, aber dies sind einige, mit denen ich vertraut bin.


Bonuslektion: Unveränderliche Datumsobjekte

Während Sie hier sind, möchte ich Ihnen einige zukünftige Kopfschmerzen ersparen. Angenommen, Sie möchten 1 Woche ab heute und 2 Wochen ab heute berechnen. Sie könnten Code schreiben wie:

<?php

// Create a datetime (now, in this case 2017-Feb-11)
$today = new DateTime();

echo $today->format('Y-m-d') . "\n<br>";
echo "---\n<br>";

$oneWeekFromToday = $today->add(DateInterval::createFromDateString('7 days'));
$twoWeeksFromToday = $today->add(DateInterval::createFromDateString('14 days'));

echo $today->format('Y-m-d') . "\n<br>";
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>";
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>";
echo "\n<br>";

Die Ausgabe:

2017-02-11 
--- 
2017-03-04 
2017-03-04 
2017-03-04

Hmmmm ... Das wollten wir nicht. Durch Ändern eines herkömmlichen DateTimeObjekts in PHP wird nicht nur das Aktualisierungsdatum zurückgegeben, sondern auch das ursprüngliche Objekt.

Hier kommt ins DateTimeImmutableSpiel.

$today = new DateTimeImmutable();

echo $today->format('Y-m-d') . "\n<br>";
echo "---\n<br>";

$oneWeekFromToday = $today->add(DateInterval::createFromDateString('7 days'));
$twoWeeksFromToday = $today->add(DateInterval::createFromDateString('14 days'));

echo $today->format('Y-m-d') . "\n<br>";
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>";
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>";

Die Ausgabe:

2017-02-11 
--- 
2017-02-11 
2017-02-18 
2017-02-25 

In diesem zweiten Beispiel erhalten wir die erwarteten Daten zurück. Indem wir DateTimeImmutablestattdessen verwenden DateTime, verhindern wir zufällige Zustandsmutationen und potenzielle Fehler.

Andy Fleming
quelle
Schätzen Sie die Antwort @DesignerGuy, aber hier ist eine richtige Liste der unterstützten Zeitzonen: php.net/manual/en/timezones.php
Chris Harrison
1
Dies sollte die akzeptierte Antwort sein und war genau das, wonach ich gesucht habe. Vielen Dank!
Brett
Manchmal hilft das Kommentieren :)
Axel
54

Stellen Sie zuerst die Standardzeitzone ein und erhalten Sie dann das Datum. Das Datum liegt in der von Ihnen angegebenen Zeitzone:

<?php 
 date_default_timezone_set('America/New_York');
 $date= date('m-d-Y') ;
 ?>

http://php.net/manual/de/function.date-default-timezone-set.php

Geister Mann
quelle
11
Beachten Sie, dass using date_default_timezone_set()es für alle Verwendungen date()nach diesem Punkt festlegt . In meiner Antwort finden Sie ein Beispiel für die Verwaltung mehrerer Zeitzonen.
Andy Fleming
9
Derzeit schlechte Praxis, wenn Sie nur ein Datum in dieser Zeitzone erhalten möchten, finden Sie in der Antwort von DesignerGuy unten eine ausführlichere Lösung.
Ward DS
Es wäre schön, eine allgemeine Möglichkeit zur Auswahl der Zeitzone zu haben.
Zan
4

Wenn Sie Zugriff auf PHP 5.3 haben, ist die intl-Erweiterung sehr hilfreich, um solche Dinge zu tun.

Hier ist ein Beispiel aus dem Handbuch:

$fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
    'America/Los_Angeles',IntlDateFormatter::GREGORIAN  );
$fmt->format(0); //0 for current time/date

In Ihrem Fall können Sie Folgendes tun:

$fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
        'America/New_York');
 $fmt->format($datetime); //where $datetime may be a DateTime object, an integer representing a Unix timestamp value (seconds since epoch, UTC) or an array in the format output by localtime(). 

Da Sie beispielsweise eine Zeitzone einstellen können America/New_York, ist dies viel besser als die Verwendung eines GMT- oder UTC-Offsets, da dies auch die Sommerzeit berücksichtigt.

Schließlich verwendet die intl-Erweiterung ICU-Daten, die viele sehr nützliche Funktionen zum Erstellen eigener Datums- / Zeitformate enthalten.

F21
quelle
4

Ich habe eine einfache Funktion erstellt, mit der Sie die Zeit in eine beliebige Zeitzone konvertieren können:

function convertTimeToLocal($datetime,$timezone='Europe/Dublin') {
        $given = new DateTime($datetime, new DateTimeZone("UTC"));
        $given->setTimezone(new DateTimeZone($timezone));
        $output = $given->format("Y-m-d"); //can change as per your requirement
        return $output;
}
Vipul Lakhtariya
quelle
1
<?php
date_default_timezone_set('GMT-5');//Set New York timezone
$today = date("F j, Y")
?>
Kyle
quelle