Die meisten Websites benötigen eine Möglichkeit, die Daten auf der Website in der vom Benutzer bevorzugten Zeitzone anzuzeigen. Unten sind zwei Listen aufgeführt , die ich gefunden habe, und dann eine Methode , die die in PHP 5 integrierte PHP DateTime- Klasse verwendet.
Ich brauche Hilfe, um zu wissen, welche davon am besten geeignet ist, um den UTC-Offset vom registrierten Benutzer zu erhalten.
Einer:
<option value="-12">[UTC - 12] Baker Island Time</option>
<option value="-11">[UTC - 11] Niue Time, Samoa Standard Time</option>
<option value="-10">[UTC - 10] Hawaii-Aleutian Standard Time, Cook Island Time</option>
<option value="-9.5">[UTC - 9:30] Marquesas Islands Time</option>
<option value="-9">[UTC - 9] Alaska Standard Time, Gambier Island Time</option>
<option value="-8">[UTC - 8] Pacific Standard Time</option>
<option value="-7">[UTC - 7] Mountain Standard Time</option>
<option value="-6">[UTC - 6] Central Standard Time</option>
<option value="-5">[UTC - 5] Eastern Standard Time</option>
<option value="-4.5">[UTC - 4:30] Venezuelan Standard Time</option>
<option value="-4">[UTC - 4] Atlantic Standard Time</option>
<option value="-3.5">[UTC - 3:30] Newfoundland Standard Time</option>
<option value="-3">[UTC - 3] Amazon Standard Time, Central Greenland Time</option>
<option value="-2">[UTC - 2] Fernando de Noronha Time, South Georgia & the South Sandwich Islands Time</option>
<option value="-1">[UTC - 1] Azores Standard Time, Cape Verde Time, Eastern Greenland Time</option>
<option value="0" selected="selected">[UTC] Western European Time, Greenwich Mean Time</option>
<option value="1">[UTC + 1] Central European Time, West African Time</option>
<option value="2">[UTC + 2] Eastern European Time, Central African Time</option>
<option value="3">[UTC + 3] Moscow Standard Time, Eastern African Time</option>
<option value="3.5">[UTC + 3:30] Iran Standard Time</option>
<option value="4">[UTC + 4] Gulf Standard Time, Samara Standard Time</option>
<option value="4.5">[UTC + 4:30] Afghanistan Time</option>
<option value="5">[UTC + 5] Pakistan Standard Time, Yekaterinburg Standard Time</option>
<option value="5.5">[UTC + 5:30] Indian Standard Time, Sri Lanka Time</option>
<option value="5.75">[UTC + 5:45] Nepal Time</option>
<option value="6">[UTC + 6] Bangladesh Time, Bhutan Time, Novosibirsk Standard Time</option>
<option value="6.5">[UTC + 6:30] Cocos Islands Time, Myanmar Time</option>
<option value="7">[UTC + 7] Indochina Time, Krasnoyarsk Standard Time</option>
<option value="8">[UTC + 8] Chinese Standard Time, Australian Western Standard Time, Irkutsk Standard Time</option>
<option value="8.75">[UTC + 8:45] Southeastern Western Australia Standard Time</option>
<option value="9">[UTC + 9] Japan Standard Time, Korea Standard Time, Chita Standard Time</option>
<option value="9.5">[UTC + 9:30] Australian Central Standard Time</option>
<option value="10">[UTC + 10] Australian Eastern Standard Time, Vladivostok Standard Time</option>
<option value="10.5">[UTC + 10:30] Lord Howe Standard Time</option>
<option value="11">[UTC + 11] Solomon Island Time, Magadan Standard Time</option>
<option value="11.5">[UTC + 11:30] Norfolk Island Time</option>
<option value="12">[UTC + 12] New Zealand Time, Fiji Time, Kamchatka Standard Time</option>
<option value="12.75">[UTC + 12:45] Chatham Islands Time</option>
<option value="13">[UTC + 13] Tonga Time, Phoenix Islands Time</option>
<option value="14">[UTC + 14] Line Island Time</option>
Oder mit PHP-freundlichen Werten:
<option value="Pacific/Midway">(GMT-11:00) Midway Island, Samoa</option>
<option value="America/Adak">(GMT-10:00) Hawaii-Aleutian</option>
<option value="Etc/GMT+10">(GMT-10:00) Hawaii</option>
<option value="Pacific/Marquesas">(GMT-09:30) Marquesas Islands</option>
<option value="Pacific/Gambier">(GMT-09:00) Gambier Islands</option>
<option value="America/Anchorage">(GMT-09:00) Alaska</option>
<option value="America/Ensenada">(GMT-08:00) Tijuana, Baja California</option>
<option value="Etc/GMT+8">(GMT-08:00) Pitcairn Islands</option>
<option value="America/Los_Angeles">(GMT-08:00) Pacific Time (US & Canada)</option>
<option value="America/Denver">(GMT-07:00) Mountain Time (US & Canada)</option>
<option value="America/Chihuahua">(GMT-07:00) Chihuahua, La Paz, Mazatlan</option>
<option value="America/Dawson_Creek">(GMT-07:00) Arizona</option>
<option value="America/Belize">(GMT-06:00) Saskatchewan, Central America</option>
<option value="America/Cancun">(GMT-06:00) Guadalajara, Mexico City, Monterrey</option>
<option value="Chile/EasterIsland">(GMT-06:00) Easter Island</option>
<option value="America/Chicago">(GMT-06:00) Central Time (US & Canada)</option>
<option value="America/New_York">(GMT-05:00) Eastern Time (US & Canada)</option>
<option value="America/Havana">(GMT-05:00) Cuba</option>
<option value="America/Bogota">(GMT-05:00) Bogota, Lima, Quito, Rio Branco</option>
<option value="America/Caracas">(GMT-04:30) Caracas</option>
<option value="America/Santiago">(GMT-04:00) Santiago</option>
<option value="America/La_Paz">(GMT-04:00) La Paz</option>
<option value="Atlantic/Stanley">(GMT-04:00) Faukland Islands</option>
<option value="America/Campo_Grande">(GMT-04:00) Brazil</option>
<option value="America/Goose_Bay">(GMT-04:00) Atlantic Time (Goose Bay)</option>
<option value="America/Glace_Bay">(GMT-04:00) Atlantic Time (Canada)</option>
<option value="America/St_Johns">(GMT-03:30) Newfoundland</option>
<option value="America/Araguaina">(GMT-03:00) UTC-3</option>
<option value="America/Montevideo">(GMT-03:00) Montevideo</option>
<option value="America/Miquelon">(GMT-03:00) Miquelon, St. Pierre</option>
<option value="America/Godthab">(GMT-03:00) Greenland</option>
<option value="America/Argentina/Buenos_Aires">(GMT-03:00) Buenos Aires</option>
<option value="America/Sao_Paulo">(GMT-03:00) Brasilia</option>
<option value="America/Noronha">(GMT-02:00) Mid-Atlantic</option>
<option value="Atlantic/Cape_Verde">(GMT-01:00) Cape Verde Is.</option>
<option value="Atlantic/Azores">(GMT-01:00) Azores</option>
<option value="Europe/Belfast">(GMT) Greenwich Mean Time : Belfast</option>
<option value="Europe/Dublin">(GMT) Greenwich Mean Time : Dublin</option>
<option value="Europe/Lisbon">(GMT) Greenwich Mean Time : Lisbon</option>
<option value="Europe/London">(GMT) Greenwich Mean Time : London</option>
<option value="Africa/Abidjan">(GMT) Monrovia, Reykjavik</option>
<option value="Europe/Amsterdam">(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna</option>
<option value="Europe/Belgrade">(GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague</option>
<option value="Europe/Brussels">(GMT+01:00) Brussels, Copenhagen, Madrid, Paris</option>
<option value="Africa/Algiers">(GMT+01:00) West Central Africa</option>
<option value="Africa/Windhoek">(GMT+01:00) Windhoek</option>
<option value="Asia/Beirut">(GMT+02:00) Beirut</option>
<option value="Africa/Cairo">(GMT+02:00) Cairo</option>
<option value="Asia/Gaza">(GMT+02:00) Gaza</option>
<option value="Africa/Blantyre">(GMT+02:00) Harare, Pretoria</option>
<option value="Asia/Jerusalem">(GMT+02:00) Jerusalem</option>
<option value="Europe/Minsk">(GMT+02:00) Minsk</option>
<option value="Asia/Damascus">(GMT+02:00) Syria</option>
<option value="Europe/Moscow">(GMT+03:00) Moscow, St. Petersburg, Volgograd</option>
<option value="Africa/Addis_Ababa">(GMT+03:00) Nairobi</option>
<option value="Asia/Tehran">(GMT+03:30) Tehran</option>
<option value="Asia/Dubai">(GMT+04:00) Abu Dhabi, Muscat</option>
<option value="Asia/Yerevan">(GMT+04:00) Yerevan</option>
<option value="Asia/Kabul">(GMT+04:30) Kabul</option>
<option value="Asia/Yekaterinburg">(GMT+05:00) Ekaterinburg</option>
<option value="Asia/Tashkent">(GMT+05:00) Tashkent</option>
<option value="Asia/Kolkata">(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi</option>
<option value="Asia/Katmandu">(GMT+05:45) Kathmandu</option>
<option value="Asia/Dhaka">(GMT+06:00) Astana, Dhaka</option>
<option value="Asia/Novosibirsk">(GMT+06:00) Novosibirsk</option>
<option value="Asia/Rangoon">(GMT+06:30) Yangon (Rangoon)</option>
<option value="Asia/Bangkok">(GMT+07:00) Bangkok, Hanoi, Jakarta</option>
<option value="Asia/Krasnoyarsk">(GMT+07:00) Krasnoyarsk</option>
<option value="Asia/Hong_Kong">(GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi</option>
<option value="Asia/Irkutsk">(GMT+08:00) Irkutsk, Ulaan Bataar</option>
<option value="Australia/Perth">(GMT+08:00) Perth</option>
<option value="Australia/Eucla">(GMT+08:45) Eucla</option>
<option value="Asia/Tokyo">(GMT+09:00) Osaka, Sapporo, Tokyo</option>
<option value="Asia/Seoul">(GMT+09:00) Seoul</option>
<option value="Asia/Yakutsk">(GMT+09:00) Yakutsk</option>
<option value="Australia/Adelaide">(GMT+09:30) Adelaide</option>
<option value="Australia/Darwin">(GMT+09:30) Darwin</option>
<option value="Australia/Brisbane">(GMT+10:00) Brisbane</option>
<option value="Australia/Hobart">(GMT+10:00) Hobart</option>
<option value="Asia/Vladivostok">(GMT+10:00) Vladivostok</option>
<option value="Australia/Lord_Howe">(GMT+10:30) Lord Howe Island</option>
<option value="Etc/GMT-11">(GMT+11:00) Solomon Is., New Caledonia</option>
<option value="Asia/Magadan">(GMT+11:00) Magadan</option>
<option value="Pacific/Norfolk">(GMT+11:30) Norfolk Island</option>
<option value="Asia/Anadyr">(GMT+12:00) Anadyr, Kamchatka</option>
<option value="Pacific/Auckland">(GMT+12:00) Auckland, Wellington</option>
<option value="Etc/GMT-12">(GMT+12:00) Fiji, Kamchatka, Marshall Is.</option>
<option value="Pacific/Chatham">(GMT+12:45) Chatham Islands</option>
<option value="Pacific/Tongatapu">(GMT+13:00) Nuku'alofa</option>
<option value="Pacific/Kiritimati">(GMT+14:00) Kiritimati</option>
Oder einfach nur PHP selbst verwenden:
$timezones = DateTimeZone::listAbbreviations();
$cities = array();
foreach( $timezones as $key => $zones )
{
foreach( $zones as $id => $zone )
{
/**
* Only get timezones explicitely not part of "Others".
* @see http://www.php.net/manual/en/timezones.others.php
*/
if ( preg_match( '/^(America|Antartica|Arctic|Asia|Atlantic|Europe|Indian|Pacific)\//', $zone['timezone_id'] )
&& $zone['timezone_id']) {
$cities[$zone['timezone_id']][] = $key;
}
}
}
// For each city, have a comma separated list of all possible timezones for that city.
foreach( $cities as $key => $value )
$cities[$key] = join( ', ', $value);
// Only keep one city (the first and also most important) for each set of possibilities.
$cities = array_unique( $cities );
// Sort by area/city name.
ksort( $cities );
Es scheint, als wäre das letzte das sicherste, da es mit der verwendeten PHP-Version wachsen würde. Sie können dieses Array auch bei Bedarf umdrehen, um Zeitzonen mit Städtenamen zu verknüpfen.
Antworten:
Ich würde es in PHP tun, außer ich würde es manchmal vermeiden, preg_match 100 zu machen und dies tun, um Ihre Liste zu generieren.
Außerdem würde ich die Namen von PHP für die 'Zeitzonen' verwenden und GMT-Offsets vergessen, die sich basierend auf der Sommerzeit ändern werden. Code wie dieser in phpbb ist nur so b / c, dass sie immer noch PHP4 unterstützen und sich nicht darauf verlassen können, dass die DateTime- oder DateTimeZone-Objekte vorhanden sind.
quelle
Undefined class constant 'AFRICA'
wenn ich versuche, die DateTimeZone-Klasse zu verwenden. Ich habe die definierten Klassen überprüft und sie sind aufgelistet, sodass Windows möglicherweise etwas anderes benötigt, damit dies funktioniert.$regions
der Wert1023
alle diese Konstanten ersetzen würde. Wenn Sie reguläre Ausdrücke benötigen, ziehen Siepreg_grep()
stattpreg_match()
.DateTimeZone::ALL
anstatt ein Array verfügbarer Regionen zu erstellen und es zu durchlaufen.Nach dem obigen Beispiel von user210179 habe ich die folgende Funktion geschrieben, um eine Liste aller Zeitzonen mit ihren Offsets zu generieren:
Dadurch wird ein Array generiert, das wie folgt aussieht:
Es ist derzeit nach Offsets sortiert, aber Sie können einfach nach dem Namen der Zeitzone sortieren, indem Sie ein
ksort()
anstelle von ausführenasort()
.quelle
$timezones = DateTimeZone::listIdentifiers( DateTimeZone::ALL );
Wenn Sie nur bestimmte Regionen$timezones = DateTimeZone::listIdentifiers( DateTimeZone::AMERICA | DateTimeZone::EUROPE );
UTC-11.00,UTC-10.00, ... ,UTC-01.00,UTC+14.00,UTC-13.00, ... ,UTC+00.00
zu sortieren alsUTC-11.00,UTC-10.00, ... ,UTC-01.00,UTC+00.00,UTC+01.00, ... ,UTC+13.00,UTC-14.00
array_merge
sollte nicht in einer Schleife verwendet werden.Trotz der Anzahl der vorhandenen Antworten habe ich eine weitere Lösung für dieses Problem gefunden. Die Profis meiner Implementierung sind:
DateTimeZone::listAbbreviations
, da diese Methode auch historische Zeitzoneninformationen zurückgibt . Favios Antwort verwendet diese Methode, was zu falschen (historischen) Offsets führtHier ist der vollständige Code:
Und hier ist ein Beispiel für die Ausgabe
quelle
line 73
. Ich weiß, dass es nicht allzu schwierig sein kann, es zu erreichen, aber ich kann einfach nicht herausfinden, wo ich zu kurz komme. Irgendwelche Gedanken wären sehr dankbar!$timezones = [];
zu$timezones = array();
und$offsets = [];
zu ändern$offsets = array();
.Ich würde es mit dem folgenden Code machen, der der akzeptierten Antwort ähnlich ist (ich bin mir bewusst, dass der Code überarbeitet werden könnte :)):
Es produziert so etwas wie:
Hoffe, das hilft ein bisschen und / oder inspiriert dich, mit etwas Besserem zu kommen.
quelle
$zone['offset'] = $z->getOffset($c);
bevor$data[] = $zone;
korrigiert angezeigt die Offsets.DateTimeZone::listAbbreviations
, um eine korrekte Liste der Zeitzonen zu erhalten.Sie können sehr einfach ein Dropdown-Menü aus diesem Array erstellen (es war eine zeitaufwändige Aufgabe, dies zusammenzustellen und zu testen). Wir verwenden diese Liste bereits in einigen unserer Apps.
Aufgrund der Sommerzeit ist es sehr wichtig , Zeitzonen-IDs in Ihrer Datenbank zu speichern und nicht nur den Zeitzonenversatz wie "GMT + 2".
AKTUALISIEREN
Ich habe die Liste der Zeitzonen aktualisiert / korrigiert (auch zur Kasse: https://github.com/paptamas/timezones ):
quelle
Das Bearbeiten der Antwort von Tamas, um alle "anderen" Einträge zu entfernen, die auf der Website php.net angegeben sind, sollte nicht mehr verwendet werden.
Vielleicht spielt es keine Rolle, sondern nur die Best Practices zu befolgen. Siehe Hinweis unten unter: http://fr2.php.net/manual/en/timezones.others.php
Auch wenn diese Liste die Azoren als GMT -1 enthält, denke ich, dass sie (zumindest manchmal) mit GMT identisch ist, aber nicht sicher.
Bearbeiten, um dies in SQL anzubieten, damit Sie die Dropdown-Liste in einem Formular erstellen und die Antwort des Benutzers stattdessen an einen Index binden können.
Erneut bearbeiten, um führenden Platz zu entfernen
quelle
Hier ist eine, die ein mehrdimensionales Array erstellt, das nach Versatz und schönem Namen sortiert ist:
Echos:
quelle
quelle
Die Verwendung von listAbbreviations () macht keinen Sinn, da für jeden Bereich alle verschiedenen Offsets zurückgegeben werden, die dort historisch verwendet wurden, nicht nur die aktuellen. Die richtige Basisquelle der Liste ist definitiv listIdentifiers ().
Ich würde die Liste nur einmal generieren und speichern, um zu vermeiden, dass sie für jede Anfrage generiert wird. Ich könnte es einmal im Monat aktualisieren.
Außerdem könnte ich alle Zeitzoneninformationen in ein separates js-Skript einfügen und die Auswahlliste selbst auf der Clientseite generieren. Das js-Skript könnte auch zwischengespeichert werden, Zeitzonen ändern sich nicht oft.
Wenn Sie auf der Clientseite Javascript verwenden, können Sie auch die aktuelle Ortszeit ermitteln und somit die Zonen finden, die jetzt dieselbe Zeit haben (die Minuten können abweichen, daher sollte der Vergleich ungefähr sein), und sie oben auf der anzeigen Liste, so dass der Benutzer nicht durch alle 400 Elemente scrollen muss. Sie können auch benachbarte Zonen (+/- 1 Stunde) anzeigen.
quelle
Ich weiß, dass dies bereits eine Antwort hat, aber ich sah eine Gelegenheit, eine der Antworten hier zu verbessern. Toland H hat einen sehr guten Code gepostet, der genau das tut, wonach die Frage gefragt hat. Unten finden Sie eine verkürzte und erweiterte Version des Codes von Toland H:
Dann müssen Sie nur noch herausfinden, was zwischen Ihren HTML-Auswahl-Tags zurückgegeben wird. Sie erhalten eine Auswahlliste wie folgt:
Und so weiter...
quelle
Diese PHP-Funktion erledigt den Job für Sie und gibt ein Array zurück:
Diese PHP-Funktion gibt ein Array aller vorhandenen Zeitzonen zurück, einschließlich Offset:
Verwenden Sie es zB so:
quelle
Ich wollte etwas Einfacheres für meine Nutzer haben, so wie Google es tut.
Dies gibt mir ein Array, das nach Ländern gruppiert ist:
Was bedeutet, dass ich jetzt so etwas wie unten machen kann (natürlich mit einigen JavaScript-Tricks):
quelle
In einigen Projekten ist es wirklich nicht sinnvoll, die detaillierten Zeitzonen von Afrika, Europa oder Pazifik zu haben. Also hier ist eine kurze Version
Dadurch wird eine Auswahl wie folgt generiert:
quelle
Tada! So einfach ist das. Gibt Ihnen ein Array mit dem Schlüssel als PHP-Zeitzone und dem Wert als Zeichenfolge im Format + -Stunden: Minuten
quelle
Ich habe dafür eine PHP-Klasse mit einem entsprechenden jQuery-Plugin erstellt. Ich habe es unter https://github.com/peterjtracey/timezoneWidget als Open-Source- Version bereitgestellt - der PHP-Code ist von einer anderen Stackoverflow-Antwort inspiriert, aber ich denke viel eleganter. Das jQuery-Plugin bietet eine großartige Oberfläche für die Auswahl einer Zeitzone.
quelle
Variante 1
Ergebnis:
Code:
Variante 2
Ergebnis:
Code:
quelle
Mit der ersten Option können Sie den Wert aus $ _POST ['was auch immer Sie auswählen'] nehmen und zu UTC hinzufügen. oder speichern Sie diesen Wert und rufen Sie dann immer UTC + userTZsetting auf, wenn Sie ihn später benötigen. scheint mir am einfachsten. Die letzte Option wäre viel wertvoller, wenn sich die Zeitzonen häufig ändern würden.
quelle
Keiner von denen. Bereiten Sie stattdessen ein Array in PHP mit diesen Zeitzonen vor. Mögen
oder
und so weiter. Generieren Sie dann ein Formular basierend auf diesem Array:
Und dann können Sie einfach mit verschiedenen Formaten wechseln, indem Sie nur den Code in der obigen Zeile ändern. Auch die Validierung wird viel einfacher und erfordert keine regulären Ausdrücke. Vergleichen Sie einfach den von POST oder GET gesendeten Wert mit einem Array. Jetzt ist es einfach festzulegen, dass $ arr [$ value_sent_by_form] [0] den PHP-kompatiblen Wert enthält, während $ arr [$ value_sent_by_form] [1] ein benutzerfreundlicher Wert ist.
quelle
Siehe auch dieses Beispiel
quelle
Nachdem ich alle hier vorgestellten Lösungen ausprobiert habe und nicht zufrieden bin, habe ich ein Skript gefunden, das meinen Anforderungen entspricht und benutzerfreundlicher ist. Für die Aufzeichnung werde ich es als mögliche Lösung speichern. Ich liebe die Copy / Paste-Lösungen :)
Das Skript gibt eine Auswahl mit der Zeitzone zurück, die Sie vorausgewählt haben möchten.
Quelle: https://e-tel.eu/2011/07/13/create-a-time-zone-drop-down-list-ddl-in-php/
quelle
Hier ist eine Klasse, die ich zusammengestellt habe und die meiner Meinung nach den besten aller Vorschläge hier mit Carbon als Abhängigkeit mischt:
Sie einfach
Timezone:all()
, und das bringt Ihnen ein Array im Format vonUTC-5:00 (America, New York)
, so dass Sie leicht ein Auswahlfeld auf Ihrem Frontend anzeigen können.quelle
Für diejenigen, die CodeIgniter verwenden, gibt es eine integrierte Date Helper-Funktion namens timezone_menu . Diese:
Produzieren Sie die folgende Ausgabe:
quelle
Ich war das:
php -r "echo json_encode(array_combine(DateTimeZone::listIdentifiers(DateTimeZone::ALL), DateTimeZone::listIdentifiers(DateTimeZone::ALL)));" > list-of-timezones.json
quelle
Ich möchte hier diese Idee belassen:
Danke dir.
quelle
Amerika Land - Zeit mit Zeitzonenliste im Array-Format.
Ich habe es in vielen Projekten verwendet und geteilt, um Ihnen zu helfen. Vielen Dank, dass Sie diese Frage gestellt haben.
quelle