Sebagian besar situs memerlukan cara untuk menampilkan tanggal di situs di zona waktu yang disukai pengguna. Di bawah ini adalah dua daftar yang saya temukan dan kemudian satu metode menggunakan PHP DateTime bawaan kelas di PHP 5.
Saya perlu bantuan untuk mengetahui yang mana di antara yang terbaik untuk dicoba ketika mencoba mendapatkan offset UTC dari pengguna saat mendaftar.
Satu:
<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>
Atau menggunakan nilai-nilai ramah PHP:
<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>
Atau hanya menggunakan PHP itu sendiri:
$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 );
Sepertinya yang terakhir akan menjadi yang paling aman karena akan tumbuh dengan rilis PHP yang digunakan. Anda juga dapat membalik array itu saat diperlukan untuk mengikat zona waktu dengan nama kota.
Jawaban:
Saya akan melakukannya dalam PHP, kecuali saya akan menghindari melakukan preg_match 100 beberapa kali dan melakukan ini untuk menghasilkan daftar Anda.
Juga, saya akan menggunakan nama PHP untuk 'zona waktu' dan melupakan offset GMT, yang akan berubah berdasarkan DST. Kode seperti itu di phpbb hanya seperti itu b / c mereka masih mendukung PHP4 dan tidak bisa mengandalkan objek DateTime atau DateTimeZone yang ada di sana.
sumber
Undefined class constant 'AFRICA'
ketika saya mencoba menggunakan kelas DateTimeZone. Saya memeriksa kelas yang ditentukan dan terdaftar jadi mungkin windows membutuhkan sesuatu yang lain agar bisa berfungsi.$regions
nilai1023
akan menggantikan semua konstanta itu. Juga, jika Anda membutuhkan ekspresi reguler, pertimbangkanpreg_grep()
sebagai gantipreg_match()
.DateTimeZone::ALL
daripada membuat array daerah yang tersedia dan mengulanginya.Mengikuti contoh user210179 di atas, saya telah menulis fungsi berikut untuk membuat saya daftar semua zona waktu dengan offset mereka:
Ini akan menghasilkan array yang terlihat seperti:
Saat ini diurutkan berdasarkan offset, tetapi Anda dapat dengan mudah mengurutkan berdasarkan nama zona waktu dengan melakukan
ksort()
alih-alihasort()
.sumber
$timezones = DateTimeZone::listIdentifiers( DateTimeZone::ALL );
Jika Anda hanya ingin memasukkan daerah tertentu, Anda dapat menelepon$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
, saya ingin menyortirnya sebagaiUTC-11.00,UTC-10.00, ... ,UTC-01.00,UTC+00.00,UTC+01.00, ... ,UTC+13.00,UTC-14.00
array_merge
seharusnya tidak digunakan dalam satu lingkaran.Terlepas dari banyaknya jawaban yang ada, saya telah membuat solusi lain untuk masalah ini. Pro implementasi saya adalah:
DateTimeZone::listAbbreviations
, karena metode itu juga mengembalikan informasi zona waktu historis . Jawaban Favio memang menggunakan metode ini, yang menghasilkan offset (historis) yang salahIni kode lengkapnya:
Dan inilah contoh outputnya
sumber
line 73
. Saya tahu itu tidak mungkin terlalu sulit untuk dicapai tetapi saya tidak tahu di mana saya gagal. Setiap pemikiran akan sangat dihargai!$timezones = [];
ke$timezones = array();
dan$offsets = [];
ke$offsets = array();
.Saya akan melakukannya dengan kode berikut yang mirip dengan jawaban yang diterima (saya tahu kode tersebut dapat di-refactored :)):
Ini menghasilkan sesuatu seperti:
Harapan yang sedikit membantu dan / atau menginspirasi Anda untuk datang dengan sesuatu yang lebih baik.
sumber
$zone['offset'] = $z->getOffset($c);
sebelum$data[] = $zone;
mengoreksi offset yang ditampilkan.DateTimeZone::listAbbreviations
, untuk mendapatkan daftar zona waktu yang benar.Anda dapat membuat dropdown yang sangat mudah dari array ini (Ini adalah tugas yang memakan waktu untuk menggabungkan ini dan mengujinya). Kami sudah menggunakan daftar ini di beberapa aplikasi kami.
Ini sangat penting untuk menyimpan pengidentifikasi zona waktu di database Anda dan bukan hanya zona waktu yang diimbangi seperti "GMT + 2", karena Daylight Saving Times.
MEMPERBARUI
Saya memperbarui / mengoreksi daftar zona waktu (juga checkout: https://github.com/paptamas/timezones ):
sumber
Mengedit jawaban Tamas untuk menghapus semua entri "lain" yang menurut situs php.net seharusnya tidak digunakan lagi.
Mungkin tidak masalah, tetapi hanya mengikuti praktik terbaik. Lihat pemberitahuan di bagian bawah: http://fr2.php.net/manual/en/timezones.others.php
Juga, meskipun daftar ini memiliki Azores sebagai GMT -1, sebenarnya saya pikir itu sama (setidaknya terkadang) dengan GMT, tetapi tidak yakin.
Mengedit untuk menawarkan ini dalam sql sehingga Anda dapat membuat daftar drop-down dalam bentuk dan meminta jawaban pengguna diikat ke indeks sebagai gantinya.
Mengedit lagi untuk menghapus ruang terdepan
sumber
Berikut ini yang membuat array multidimensi yang diurutkan berdasarkan nama offset dan nice:
Echos:
sumber
sumber
Menggunakan listAbbreviations () tidak masuk akal karena untuk setiap area itu mengembalikan semua offset berbeda yang secara historis digunakan di sana, bukan hanya yang saat ini. Sumber dasar yang tepat dari daftar ini jelas listIdentifiers ().
Saya akan menghasilkan daftar sekali saja dan menyimpannya untuk menghindari menghasilkannya untuk setiap permintaan. Saya bisa menyegarkannya sebulan sekali.
Juga, saya bisa memasukkan semua info zona waktu ke skrip js terpisah dan membuat daftar pilih sendiri di sisi klien. Skrip js dapat di-cache juga, zona waktu tidak sering berubah.
Selain itu, menggunakan javascript di sisi klien, Anda dapat mengetahui waktu setempat saat ini, dan karenanya Anda dapat menemukan zona yang memiliki waktu yang sama sekarang (menit mungkin berbeda, jadi perbandingannya harus perkiraan), dan menampilkannya di atas daftar, sehingga pengguna tidak perlu menelusuri semua 400 item. Anda juga dapat menampilkan zona yang berdekatan (+/- 1 jam) berikut.
sumber
Saya tahu ini sudah memiliki jawaban tetapi saya melihat peluang untuk memperbaiki salah satu jawaban di sini. Toland H memposting beberapa kode yang sangat bagus yang melakukan persis apa yang diminta pertanyaan itu. Di bawah ini adalah versi singkat dan memperluas kode Toland H:
Maka yang perlu Anda lakukan adalah mengulang apa yang dikembalikan di antara tag pilih html Anda. Anda akan mendapatkan daftar pilih seperti ini:
Dan seterusnya...
sumber
Fungsi PHP ini melakukan Pekerjaan untuk Anda dan mengembalikan array:
Fungsi PHP ini mengembalikan array dari semua Zona Waktu yang ada termasuk Offset:
Gunakan misalnya seperti ini:
sumber
Saya ingin memiliki sesuatu yang lebih sederhana untuk pengguna saya, cara Google melakukannya ..
Ini memberi saya array yang dikelompokkan berdasarkan negara:
Yang berarti sekarang saya dapat melakukan sesuatu seperti di bawah ini (tentu saja dengan beberapa tipuan javaScript):
sumber
Dalam beberapa proyek benar-benar tidak masuk akal untuk memiliki zona waktu terperinci dari Afrika, Eropa atau Pasifik. Jadi ini adalah versi singkatnya
ini akan menghasilkan pilih seperti di bawah ini:
sumber
Tada! Sesederhana ini. Memberi Anda sebuah array dengan kunci sebagai zona waktu PHP dan nilai sebagai string dalam format + -Jam: Menit
sumber
Saya membuat kelas PHP untuk ini dengan plugin jQuery yang sesuai. Saya sudah membuka-sumber di https://github.com/peterjtracey/timezoneWidget - kode PHP terinspirasi oleh jawaban stackoverflow lain, tapi saya pikir jauh lebih elegan. Plugin jQuery memberikan antarmuka yang bagus untuk memilih zona waktu.
sumber
Varian 1
Hasil:
Kode:
Varian 2
Hasil:
Kode:
sumber
opsi pertama akan memungkinkan Anda mengambil nilai dari $ _POST ['whateveryoucalltheselect'] dan menambahkannya ke UTC. atau bahkan menyimpan nilai itu dan kemudian selalu memanggil UTC + userTZsetting kapan pun Anda membutuhkannya. sepertinya paling mudah bagi saya. opsi terakhir akan jauh lebih berharga jika zona waktu sering berubah.
sumber
Tidak satupun dari mereka. Alih-alih menyiapkan array dalam PHP dengan zona waktu itu. Suka
atau
dan seterusnya. Kemudian hasilkan form berdasarkan pada array ini:
Dan kemudian Anda dapat dengan mudah beralih dengan format yang berbeda hanya dengan modifikasi kode di baris di atas. Validasi juga akan jauh lebih mudah dan tidak memerlukan ekspresi reguler. Bandingkan saja nilai yang dikirim oleh POST atau GET dengan array. Sekarang mudah untuk mengatur $ arr [$ value_sent_by_form] [0] menyimpan nilai yang kompatibel dengan PHP sementara $ arr [$ value_sent_by_form] [1] nilai ramah pengguna.
sumber
Lihat contoh ini juga
sumber
Setelah mencoba semua solusi yang disajikan di sini dan tidak puas, saya telah menemukan skrip yang sesuai dengan kebutuhan saya dan lebih ramah pengguna. Sebagai catatan, saya akan menyimpannya sebagai solusi yang memungkinkan. Saya suka solusi salin / tempel :)
Script mengembalikan pilihan dengan zona waktu apa pun yang Anda inginkan terpilih sebelumnya.
Sumber: https://e-tel.eu/2011/07/13/create-a-time-zone-drop-down-list-ddl-in-php/
sumber
Inilah kelas yang saya kumpulkan, mencampur apa yang saya pikir merupakan saran terbaik di sini, dan dengan Karbon sebagai ketergantungan:
Anda cukup
Timezone:all()
, dan itu membuat Anda array dalam formatUTC-5:00 (America, New York)
, sehingga Anda dapat dengan mudah menampilkan bidang pilih di frontend Anda.sumber
Bagi mereka yang menggunakan CodeIgniter, ada fungsi Date Helper bawaan yang disebut timezone_menu . Ini:
Hasilkan keluaran berikut:
sumber
Saya melakukan ini:
php -r "echo json_encode(array_combine(DateTimeZone::listIdentifiers(DateTimeZone::ALL), DateTimeZone::listIdentifiers(DateTimeZone::ALL)));" > list-of-timezones.json
sumber
Saya ingin meninggalkan ide ini di sini:
Terima kasih.
sumber
Negara Amerika - Waktu dengan Daftar Zona Waktu dalam Format Array.
Saya telah menggunakannya di banyak proyek, berbagi untuk membantu Anda. Terima kasih telah mengajukan pertanyaan ini.
sumber