Większość witryn potrzebuje sposobu, aby pokazać daty w witrynie w preferowanej strefie czasowej użytkownika. Poniżej znajdują się dwie listy, które znalazłem, a następnie jedna metoda wykorzystująca wbudowaną klasę PHP DateTime w PHP 5.
Potrzebuję pomocy, aby dowiedzieć się, które z nich byłyby najlepsze do użycia podczas próby uzyskania przesunięcia czasu UTC od użytkownika w rejestrze.
Jeden:
<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>
Lub używając przyjaznych dla PHP wartości:
<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>
Lub po prostu używając samego PHP:
$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 );
Wygląda na to, że ostatnia byłaby najbezpieczniejsza, ponieważ rozrosłaby się wraz z użyciem wersji PHP. Możesz także odwrócić tę tablicę, gdy trzeba, aby powiązać strefy czasowe z nazwami miast.
Odpowiedzi:
Zrobiłbym to w PHP, z wyjątkiem tego, że unikałbym czasami wykonywania preg_match 100 i robiłbym to, aby wygenerować twoją listę.
Poza tym użyłbym nazw PHP dla „stref czasowych” i zapomniałbym o przesunięciach czasu GMT, które będą się zmieniać w zależności od czasu letniego. Taki kod w phpbb jest tylko taki, że b / c nadal obsługują PHP4 i nie mogą polegać na istniejących obiektach DateTime lub DateTimeZone.
źródło
Undefined class constant 'AFRICA'
gdy próbuję użyć klasy DateTimeZone. Sprawdziłem zdefiniowane klasy i jest na liście, więc może Windows potrzebuje czegoś innego, aby to działało.$regions
że wartość1023
zastąpiłaby wszystkie te stałe. Ponadto, jeśli potrzebujesz wyrażeń regularnych, rozważpreg_grep()
zamiastpreg_match()
.DateTimeZone::ALL
zamiast tworzyć szereg dostępnych regionów i przechodzić przez niego.Zgodnie z powyższym przykładem użytkownika210179, napisałem następującą funkcję, aby wygenerować listę wszystkich stref czasowych z ich przesunięciami:
Spowoduje to wygenerowanie tablicy wyglądającej następująco:
Obecnie jest posortowany według przesunięć, ale możesz łatwo posortować według nazwy strefy czasowej, wykonując
ksort()
zamiastasort()
.źródło
$timezones = DateTimeZone::listIdentifiers( DateTimeZone::ALL );
Jeśli chcesz uwzględnić tylko niektóre regiony, możesz zadzwonić$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
chcę je posortować jakoUTC-11.00,UTC-10.00, ... ,UTC-01.00,UTC+00.00,UTC+01.00, ... ,UTC+13.00,UTC-14.00
array_merge
nie powinny być używane w pętli.Pomimo wielu istniejących odpowiedzi, stworzyłem jeszcze jedno rozwiązanie tego problemu. Zalety mojej implementacji to:
DateTimeZone::listAbbreviations
, ponieważ ta metoda zwraca również historyczne informacje o strefie czasowej . Odpowiedź Favio wykorzystuje tę metodę, co skutkuje nieprawidłowymi (historycznymi) przesunięciamiOto pełny kod:
A oto przykład wyniku
źródło
line 73
. Wiem, że nie może być to zbyt trudne do osiągnięcia, ale po prostu nie potrafię zrozumieć, gdzie mi się nie udaje. Wszelkie myśli będą mile widziane!$timezones = [];
na$timezones = array();
i$offsets = [];
na$offsets = array();
.Zrobiłbym to z następującym kodem, który jest podobny do zaakceptowanej odpowiedzi (wiem, że kod można refaktoryzować :)):
Tworzy coś takiego:
Mam nadzieję, że to trochę pomoże i / lub zainspiruje Cię do zrobienia czegoś lepszego.
źródło
$zone['offset'] = $z->getOffset($c);
przed$data[] = $zone;
skorygowaniem wyświetlanych przesunięć.DateTimeZone::listAbbreviations
, aby uzyskać poprawną listę stref czasowych.Możesz bardzo łatwo utworzyć listę rozwijaną z tej tablicy (złożenie tego i przetestowanie było czasochłonne). Używamy już tej listy w niektórych naszych aplikacjach.
Jest bardzo ważne, aby identyfikatorów sklep strefy czasowej w bazie danych, a nie tylko strefy czasowej, jak „GMT + 2”, z powodu letniego Times.
AKTUALIZACJA
Zaktualizowałem / poprawiłem listę stref czasowych (również do kasy: https://github.com/paptamas/timezones ):
źródło
Edycja odpowiedzi Tamasa w celu usunięcia wszystkich „innych” wpisów, które według witryny php.net nie powinny być już używane.
Może nie ma to znaczenia, ale po prostu przestrzeganie najlepszych praktyk. Zobacz informację na dole: http://fr2.php.net/manual/en/timezones.others.php
Ponadto, chociaż ta lista ma Azory jako GMT -1, w rzeczywistości myślę, że jest to to samo (przynajmniej czasami) co GMT, ale nie jestem pewien.
Edytowanie, aby zaoferować to w sql, aby można było utworzyć listę rozwijaną w formularzu i zamiast tego powiązać odpowiedź użytkownika z indeksem.
Edycja ponownie, aby usunąć wiodącą spację
źródło
Oto taka, która tworzy wielowymiarową tablicę posortowaną według przesunięcia i poprawionej nazwy:
Echa:
źródło
źródło
Używanie listAbbreviations () nie ma sensu, ponieważ dla każdego obszaru zwraca wszystkie różne przesunięcia, które były tam używane w przeszłości, a nie tylko bieżące. Prawym podstawowym źródłem listy jest zdecydowanie listIdentifiers ().
Generowałbym listę tylko raz i zapisywałbym ją, aby uniknąć generowania jej dla każdego żądania. Mógłbym to odświeżyć raz w miesiącu.
Mogłem również umieścić wszystkie informacje o strefach czasowych w osobnym skrypcie js i samodzielnie wygenerować listę wyboru po stronie klienta. Skrypt js może być również buforowany, strefy czasowe nie zmieniają się często.
Ponadto, używając javascript po stronie klienta, możesz poznać aktualny czas lokalny, a tym samym możesz znaleźć strefy, które mają teraz ten sam czas (minuty mogą się różnić, więc porównanie powinno być przybliżone) i wyświetlić je na górze list, więc użytkownik nie musi przeglądać wszystkich 400 pozycji. Możesz również wyświetlić sąsiednie strefy (+/- 1 godzina).
źródło
Wiem, że to już odpowiedź, ale widziałem okazję, aby ulepszyć jedną z odpowiedzi tutaj. Toland H opublikował bardzo dobry kod, który robi dokładnie to, o co chodziło w pytaniu. Poniżej znajduje się skrócona i rozszerzona wersja kodu Tolanda H:
Następnie wszystko, co musisz zrobić, to powtórzyć to, co jest zwracane między tagami HTML Select. Otrzymasz listę wyboru podobną do tej:
I tak dalej...
źródło
Ta funkcja PHP wykonuje pracę za Ciebie i zwraca tablicę:
Ta funkcja PHP zwraca tablicę wszystkich istniejących stref czasowych, w tym przesunięcia:
Użyj go np. W ten sposób:
źródło
Chciałem mieć coś prostszego dla moich użytkowników, sposób, w jaki robi to Google.
To daje mi tablicę pogrupowaną według krajów:
Co oznacza, że teraz mogę zrobić coś takiego poniżej (oczywiście z pewną sztuczką javaScript):
źródło
W niektórych projektach posiadanie szczegółowych stref czasowych dla Afryki, Europy czy Pacyfiku naprawdę nie ma sensu. Oto krótka wersja
spowoduje to wybór, jak poniżej:
źródło
Tada! To takie proste. Daje tablicę z kluczem jako strefą czasową PHP i wartością jako ciągiem w formacie + -Hours: Minutes
źródło
Stworzyłem w tym celu klasę PHP z odpowiednią wtyczką jQuery. Umieściłem go na stronie https://github.com/peterjtracey/timezoneWidget - kod PHP jest inspirowany inną odpowiedzią typu stackoverflow, ale myślę, że jest znacznie bardziej elegancki. Wtyczka jQuery zapewnia doskonały interfejs do wyboru strefy czasowej.
źródło
Wariant 1
Wynik:
Kod:
Wariant 2
Wynik:
Kod:
źródło
pierwsza opcja pozwoli ci pobrać wartość z $ _POST ['cokolwiek wybierzesz'] i dodać ją do UTC. lub nawet zapisz tę wartość, a następnie zawsze wywołuj UTC + userTZsetting, kiedy będziesz tego potrzebować później. wydaje mi się najłatwiejszy. ostatnia opcja byłaby znacznie bardziej wartościowa, gdyby strefy czasowe zmieniały się często.
źródło
Żaden z nich. Zamiast tego przygotuj tablicę w PHP z tymi strefami czasowymi. Lubić
lub
i tak dalej. Następnie wygeneruj formularz na podstawie tej tablicy:
A potem możesz łatwo przełączać się na różne formaty, po prostu modyfikując kod w powyższej linii. Również walidacja będzie znacznie łatwiejsza i nie będzie wymagać wyrażeń regularnych. Wystarczy porównać wartość przesłaną przez POST lub GET z tablicą. Teraz łatwo jest ustawić $ arr [$ value_sent_by_form] [0] przechowuje wartość zgodną z PHP, a $ arr [$ value_sent_by_form] [1] wartość przyjazną dla użytkownika.
źródło
Zobacz również ten przykład
źródło
Po wypróbowaniu wszystkich przedstawionych tutaj rozwiązań i niezadowoleniu, znalazłem skrypt, który odpowiada moim potrzebom i jest bardziej przyjazny dla użytkownika. Dla porządku zapiszę to jako możliwe rozwiązanie. Uwielbiam rozwiązania kopiuj / wklej :)
Skrypt zwraca wybór z dowolną strefą czasową, którą chcesz wstępnie wybrać.
Źródło: https://e-tel.eu/2011/07/13/create-a-time-zone-drop-down-list-ddl-in-php/
źródło
Oto klasa, którą stworzyłem, łącząc to, co uważałem za najlepszą ze wszystkich sugestii tutaj, z węglem jako zależnością:
Po prostu
Timezone:all()
otrzymujesz tablicę w formacieUTC-5:00 (America, New York)
, dzięki czemu możesz łatwo wyświetlić pole wyboru na swoim interfejsie.źródło
Dla tych, którzy używają CodeIgniter, istnieje wbudowana funkcja Date Helper o nazwie timezone_menu . Te:
Utwórz następujący wynik:
źródło
Ja to zrobiłem:
php -r "echo json_encode(array_combine(DateTimeZone::listIdentifiers(DateTimeZone::ALL), DateTimeZone::listIdentifiers(DateTimeZone::ALL)));" > list-of-timezones.json
źródło
Chciałbym tutaj zostawić ten pomysł:
Dziękuję Ci.
źródło
Ameryka - czas z listą stref czasowych w formacie tablicowym.
Używałem go w wielu projektach, dzieląc się, aby ci pomóc. Dziękuję, że zadałeś to pytanie.
źródło