La mayoría de los sitios necesitan alguna forma de mostrar las fechas en el sitio en la zona horaria preferida por los usuarios. A continuación hay dos listas que encontré y luego un método que usa la clase PHP DateTime integrada en PHP 5.
Necesito ayuda para saber cuál de estos sería el mejor para intentar usar cuando intento obtener el desplazamiento UTC del usuario en el registro.
Uno:
<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>
O usando valores amigables de 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>
O simplemente usando 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 );
Parece que el último sería el más seguro ya que crecería con la versión de PHP que se está utilizando. También puede voltear esa matriz cuando sea necesario para vincular las zonas horarias con los nombres de las ciudades.
Respuestas:
Lo haría en PHP, excepto que evitaría hacer preg_match 100 algunas veces y hacer esto para generar su lista.
Además, usaría los nombres de PHP para las 'zonas horarias' y me olvidaría de las compensaciones GMT, que cambiarán según el horario de verano. Un código como ese en phpbb es solo de esa manera b / c todavía son compatibles con PHP4 y no pueden confiar en que los objetos DateTime o DateTimeZone estén allí.
fuente
Undefined class constant 'AFRICA'
cuando intento usar la clase DateTimeZone. Revisé las clases definidas y está en la lista, por lo que quizás Windows necesite algo más para que esto funcione.$regions
el valor1023
reemplazaría todas esas constantes. Además, si necesita expresiones regulares, considere enpreg_grep()
lugar depreg_match()
.DateTimeZone::ALL
lugar de crear una matriz de regiones disponibles y recorrerlo.Siguiendo el ejemplo anterior de user210179, he escrito la siguiente función para generarme una lista de todas las zonas horarias con sus desplazamientos:
Esto generará una matriz similar a:
Actualmente está ordenado por compensaciones, pero puede ordenar fácilmente por el nombre de la zona horaria haciendo un en
ksort()
lugar deasort()
.fuente
$timezones = DateTimeZone::listIdentifiers( DateTimeZone::ALL );
Si sólo desea incluir ciertas regiones, puede llamar$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
, quiero ordenarlos comoUTC-11.00,UTC-10.00, ... ,UTC-01.00,UTC+00.00,UTC+01.00, ... ,UTC+13.00,UTC-14.00
array_merge
no debe usarse en un bucle.A pesar de la cantidad de respuestas existentes, he hecho otra solución a este problema. Los pros de mi implementación son:
DateTimeZone::listAbbreviations
, ya que ese método también devuelve información histórica de zona horaria . La respuesta de Favio usa este método, lo que resulta en compensaciones incorrectas (históricas)Aquí está el código completo:
Y aquí hay un ejemplo de la salida
fuente
line 73
. Sé que no puede ser demasiado difícil de lograr, pero no puedo entender dónde me estoy quedando corto. Cualquier idea sería muy apreciada!$timezones = [];
a$timezones = array();
y$offsets = [];
a$offsets = array();
.Lo haría con el siguiente código que es similar a la respuesta aceptada (sé que el código podría ser refactorizado :)):
Produce algo como:
Espero que ayude un poco y / o te inspire a venir con algo mejor.
fuente
$zone['offset'] = $z->getOffset($c);
antes$data[] = $zone;
corrige los desplazamientos mostrados.DateTimeZone::listAbbreviations
, para obtener una lista correcta de zonas horarias.Puede crear un menú desplegable muy fácil a partir de esta matriz (fue una tarea que llevó mucho tiempo armar esto y probarlo). Ya usamos esta lista en algunas de nuestras aplicaciones.
Es muy importante almacenar identificadores de zona horaria en su base de datos y no solo el desplazamiento de la zona horaria como "GMT + 2", debido al horario de verano.
ACTUALIZAR
Actualicé / corregí la lista de zonas horarias (también pago: https://github.com/paptamas/timezones ):
fuente
Edición de la respuesta de Tamas para eliminar todas las "otras" entradas que el sitio php.net dice que ya no deberían usarse.
Tal vez no importa, pero solo siguiendo las mejores prácticas. Vea el aviso en la parte inferior de: http://fr2.php.net/manual/en/timezones.others.php
Además, aunque esta lista tiene las Azores como GMT -1, de hecho creo que es lo mismo (al menos a veces) que GMT, pero no estoy seguro.
Edición para ofrecer esto en sql para que pueda crear la lista desplegable en un formulario y que la respuesta del usuario esté vinculada a un índice.
Edición de nuevo para eliminar el espacio inicial
fuente
Aquí hay uno que crea una matriz multidimensional ordenada por desplazamiento y nombre modificado:
Ecos:
fuente
fuente
El uso de listAbbreviations () no tiene sentido ya que para cada área devuelve todas las diferentes compensaciones que históricamente se usaron allí, no solo las actuales. La fuente base correcta de la lista es definitivamente listIdentifiers ().
Generaría la lista solo una vez y la guardaría para evitar generarla para cada solicitud. Podría actualizarlo una vez al mes.
Además, podría poner toda la información de zonas horarias en un script js separado y generar la lista de selección en el lado del cliente. El script js también se puede almacenar en caché, las zonas horarias no cambian a menudo.
Además, al usar JavaScript en el lado del cliente, puede conocer la hora local actual y, por lo tanto, puede encontrar las zonas que tienen la misma hora ahora (los minutos pueden diferir, por lo que la comparación debe ser aproximada) y mostrarlos en la parte superior de la pantalla. lista, por lo que el usuario no tiene que desplazarse por los 400 elementos. También puede mostrar las zonas adyacentes (+/- 1 hora) a continuación.
fuente
Sé que esto ya tiene una respuesta, pero vi una oportunidad para mejorar una de las respuestas aquí. Toland H publicó un código muy bueno que hace exactamente lo que pedía la pregunta. A continuación se muestra una versión abreviada y ampliada del código de Toland H:
Entonces, todo lo que necesita hacer es hacer eco de lo que se devuelve entre sus etiquetas de selección html. Obtendrá una lista de selección como esta:
Y así...
fuente
Esta función PHP hace el trabajo por usted y devuelve una matriz:
Esta función PHP devuelve una matriz de todas las zonas horarias existentes, incluida la compensación:
Úselo, por ejemplo, así:
fuente
Quería tener algo más simple para mis usuarios, como lo hace Google ...
Esto me da una matriz agrupada por países:
Lo que significa que ahora puedo hacer algo como a continuación (por supuesto, con algunos trucos javaScript):
fuente
En algunos proyectos, realmente no tiene sentido tener las zonas horarias detalladas de África, Europa o el Pacífico. Así que aquí hay una versión corta
esto generará una selección de la siguiente manera:
fuente
Tada! Es así de simple. Le da una matriz con la clave como la zona horaria de PHP y el valor como una cadena en el formato + -Hours: Minutes
fuente
Creé una clase PHP para esto con el complemento jQuery correspondiente. Lo he abierto en https://github.com/peterjtracey/timezoneWidget : el código PHP está inspirado en otra respuesta de stackoverflow, pero creo que es mucho más elegante. El complemento jQuery ofrece una excelente interfaz para seleccionar una zona horaria.
fuente
Variante 1
Resultado:
Código:
Variante 2
Resultado:
Código:
fuente
la primera opción le permitiría tomar el valor de $ _POST ['whateveryllcalltheselect'] y agregarlo a UTC. o incluso almacenar ese valor y luego siempre llamar a UTC + userTZsetting cuando lo necesite más tarde. me parece más fácil la última opción sería mucho más valiosa si las zonas horarias cambiaran con frecuencia.
fuente
Ninguno de ellos. En su lugar, prepare una matriz en PHP con esas zonas horarias. Me gusta
o
y así. Luego genere un formulario basado en esta matriz:
Y luego puede cambiar fácilmente con diferentes formatos con solo la modificación del código en la línea anterior. Además, la validación será mucho más fácil y no requerirá expresiones regulares. Simplemente compare el valor enviado por POST o GET con una matriz. Ahora es fácil establecer $ arr [$ value_sent_by_form] [0] tiene un valor compatible con PHP, mientras que $ arr [$ value_sent_by_form] [1] es un valor fácil de usar.
fuente
Vea este ejemplo también
fuente
Después de probar todas las soluciones presentadas aquí y no estar satisfecho, he encontrado un script que satisface mis necesidades y es más fácil de usar. Para el registro, lo guardaré como una posible solución. Me encantan las soluciones de copiar / pegar :)
El script devuelve una selección con la zona horaria que desee preseleccionar.
Fuente: https://e-tel.eu/2011/07/13/create-a-time-zone-drop-down-list-ddl-in-php/
fuente
Aquí hay una clase que armé, mezclando lo que pensé que era la mejor de todas las sugerencias aquí, y con Carbon como dependencia:
Simplemente
Timezone:all()
, y eso le da una matriz en el formato deUTC-5:00 (America, New York)
, para que pueda mostrar fácilmente un campo de selección en su interfaz.fuente
Para aquellos que usan CodeIgniter, hay una función integrada de Fecha Helper llamada timezone_menu . Estas:
Produzca el siguiente resultado:
fuente
Hice esto:
php -r "echo json_encode(array_combine(DateTimeZone::listIdentifiers(DateTimeZone::ALL), DateTimeZone::listIdentifiers(DateTimeZone::ALL)));" > list-of-timezones.json
fuente
Me gustaría dejar aquí esta idea:
Gracias.
fuente
País de América: hora con la lista de zonas horarias en formato de matriz.
Lo he usado en muchos proyectos, compartiendo para ayudarte. Gracias por hacer esta pregunta.
fuente