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');
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.
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-042017-03-042017-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.
In diesem zweiten Beispiel erhalten wir die erwarteten Daten zurück. Indem wir DateTimeImmutablestattdessen verwenden DateTime, verhindern wir zufällige Zustandsmutationen und potenzielle Fehler.
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.
Ich habe eine einfache Funktion erstellt, mit der Sie die Zeit in eine beliebige Zeitzone konvertieren können:
functionconvertTimeToLocal($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 requirementreturn $output;
}
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');
Bibliotheken
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
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 verwendenDateTime
, verhindern wir zufällige Zustandsmutationen und potenzielle Fehler.quelle
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
quelle
date_default_timezone_set()
es für alle Verwendungendate()
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.
quelle
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; }
quelle
<?php date_default_timezone_set('GMT-5');//Set New York timezone $today = date("F j, Y") ?>
quelle