Ich möchte das heutige Datum in einer Zeitzone im Paul Eggert-Format ( America/New_York
) in PHP erhalten.
Ich möchte das heutige Datum in einer Zeitzone im Paul Eggert-Format ( America/New_York
) in PHP erhalten.
Antworten:
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');
Ich bin mir sicher, dass es eine Reihe anderer Bibliotheken gibt, aber dies sind einige, mit denen ich vertraut bin.
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 DateTime
Objekts in PHP wird nicht nur das Aktualisierungsdatum zurückgegeben, sondern auch das ursprüngliche Objekt.
Hier kommt ins DateTimeImmutable
Spiel.
$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 DateTimeImmutable
stattdessen verwenden DateTime
, verhindern wir zufällige Zustandsmutationen und potenzielle Fehler.
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
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.
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.
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;
}