A maioria dos sites precisa de alguma maneira de mostrar as datas no site no fuso horário preferido dos usuários. Abaixo estão duas listas que eu encontrei e, em seguida, um método usando a classe DateTime embutida no PHP 5.
Preciso de ajuda para saber qual desses seria o melhor tentar usar ao tentar obter o deslocamento UTC do usuário no registro.
1:
<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>
Ou usando valores compatíveis com 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>
Ou apenas usando o próprio 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 o último seria o mais seguro, pois aumentaria com o lançamento do PHP. Você também pode inverter essa matriz quando necessário para vincular fusos horários a nomes de cidades.
Respostas:
Eu faria isso em PHP, exceto que evitaria fazer o preg_match 100 algumas vezes e faria isso para gerar sua lista.
Além disso, eu usaria os nomes do PHP para os 'fusos horários' e esqueceria as compensações GMT, que serão alteradas com base no horário de verão. Um código assim no phpbb é apenas dessa forma porque eles ainda suportam o PHP4 e não podem confiar nos objetos DateTime ou DateTimeZone que estão lá.
fonte
Undefined class constant 'AFRICA'
quando tento usar a classe DateTimeZone. Eu verifiquei as classes definidas e ele está listado, então talvez o Windows precise de algo mais para que isso funcione.$regions
o valor1023
substituiria todas essas constantes. Além disso, se você precisar de expressões regulares, considere empreg_grep()
vez depreg_match()
.DateTimeZone::ALL
vez de criar uma matriz de regiões disponíveis e fazer um loop por ela.Seguindo o exemplo de user210179 acima, escrevi a seguinte função para gerar uma lista de todos os fusos horários com seus desvios:
Isso irá gerar uma matriz parecida com:
Atualmente, ele é classificado por deslocamentos, mas você pode classificar facilmente pelo nome do fuso horário executando um em
ksort()
vez deasort()
.fonte
$timezones = DateTimeZone::listIdentifiers( DateTimeZone::ALL );
Se você quiser incluir apenas determinadas regiões, pode ligar.$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
, quero classificá-los comoUTC-11.00,UTC-10.00, ... ,UTC-01.00,UTC+00.00,UTC+01.00, ... ,UTC+13.00,UTC-14.00
array_merge
não deve ser usado em um loop.Apesar do número de respostas existentes, eu fiz outra solução para esse problema. Os profissionais da minha implementação são:
DateTimeZone::listAbbreviations
, pois esse método também retorna informações históricas do fuso horário . A resposta de Favio usa esse método, que resulta em compensações incorretas (históricas)Aqui está o código completo:
E aqui está um exemplo da saída
fonte
line 73
. Eu sei que não pode ser muito difícil de alcançar, mas simplesmente não consigo descobrir onde estou aquém. Qualquer pensamento seria muito apreciado!$timezones = [];
para$timezones = array();
e$offsets = [];
para$offsets = array();
.Eu faria isso com o código a seguir, que é semelhante à resposta aceita (sei que o código pode ser refatorado :)):
Produz algo como:
Espero que ajude um pouco e / ou inspire você a vir com algo melhor.
fonte
$zone['offset'] = $z->getOffset($c);
antes$data[] = $zone;
corrige os deslocamentos exibidos.DateTimeZone::listAbbreviations
, para obter uma lista correta de fusos horários.Você pode criar uma lista suspensa muito fácil a partir dessa matriz (era uma tarefa demorada reunir isso e testá-lo). Já usamos essa lista em alguns de nossos aplicativos.
É muito importante armazenar identificadores de fuso horário no seu banco de dados e não apenas o deslocamento do fuso horário como "GMT + 2", devido ao horário de verão.
ATUALIZAR
Atualizei / corrigi a lista de fusos horários (também faça o checkout: https://github.com/paptamas/timezones ):
fonte
Editando a resposta do Tamas para remover todas as "outras" entradas que o site php.net diz que não devem mais ser usadas.
Talvez não importe, mas apenas seguindo as práticas recomendadas. Consulte o aviso na parte inferior de: http://fr2.php.net/manual/en/timezones.others.php
Além disso, embora esta lista tenha os Açores como GMT -1, na verdade acho que é o mesmo (pelo menos às vezes) como GMT, mas não tenho certeza.
Edição para oferecer isso no sql, para que você possa criar a lista suspensa em um formulário e, em vez disso, vincular a resposta do usuário a um índice.
Editando novamente para remover o espaço inicial
fonte
Aqui está um que cria uma matriz multidimensional classificada por deslocamento e nome legal:
Echos:
fonte
fonte
O uso de listAbbreviations () não faz sentido, pois em todas as áreas ele retorna todos os diferentes deslocamentos que foram historicamente usados ali, não apenas os atuais. A fonte base correta da lista é definitivamente listIdentifiers ().
Eu geraria a lista apenas uma vez e a salvaria para evitar gerá-la para cada solicitação. Eu poderia atualizá-lo uma vez por mês.
Além disso, eu poderia colocar todas as informações de fuso horário em um script js separado e gerar a própria lista de seleção no lado do cliente. O script js também pode ser armazenado em cache, os fusos horários não mudam frequentemente.
Além disso, usando javascript no lado do cliente, você pode saber a hora local atual e, portanto, pode encontrar as zonas que possuem a mesma hora agora (os minutos podem ser diferentes, portanto a comparação deve ser aproximada) e exibi-los na parte superior do lista, para que o usuário não precise rolar por todos os 400 itens. Você também pode exibir as zonas adjacentes (+/- 1 hora) a seguir.
fonte
Sei que isso já tem uma resposta, mas vi uma oportunidade de melhorar uma das respostas aqui. Toland H postou um código muito bom que faz exatamente o que a pergunta estava pedindo. Abaixo está uma versão abreviada e expandida do código de Toland H:
Então tudo que você precisa fazer é repetir o que é retornado entre as tags de seleção html. Você receberá uma lista de seleção mais ou menos assim:
E assim por diante...
fonte
Esta função PHP faz o trabalho para você e devolve uma matriz:
Esta função PHP retorna uma matriz de todos os fusos horários existentes, incluindo Offset:
Use-o, por exemplo:
fonte
Eu queria ter algo mais simples para meus usuários, da maneira que o Google faz ..
Isso me dá uma matriz agrupada por países:
O que significa que agora eu posso fazer algo como abaixo (é claro, com alguns truques javaScript):
fonte
Em alguns projetos, realmente não faz sentido ter os fusos horários detalhados da África, Europa ou Pacífico. Então aqui está uma versão curta
isso irá gerar uma seleção como abaixo:
fonte
Tada! É simples assim. Fornece uma matriz com a chave como fuso horário do PHP e o valor como uma sequência no formato + -Hours: Minutes
fonte
Eu criei uma classe PHP para isso com um plugin jQuery correspondente. Eu o código aberto em https://github.com/peterjtracey/timezoneWidget - o código PHP é inspirado por outra resposta de stackoverflow, mas acho muito mais elegante. O plugin jQuery fornece uma ótima interface para selecionar um fuso horário.
fonte
Variante 1
Resultado:
Código:
Variante 2
Resultado:
Código:
fonte
a primeira opção permitiria que você pegasse o valor de $ _POST ['qualquer coisa que você chamar'] e o adicionasse ao UTC. ou mesmo armazene esse valor e sempre chame UTC + userTZsetting sempre que precisar mais tarde. parece mais fácil para mim. a última opção seria muito mais valiosa se os fusos horários mudassem com frequência.
fonte
Nenhum deles. Em vez disso, prepare uma matriz em PHP com esses fusos horários. Gostar
ou
e assim por diante. Em seguida, gere o formulário com base nesta matriz:
E então você pode alternar facilmente com diferentes formatos com apenas uma modificação de código na linha acima. A validação também será muito mais fácil e não exigirá expressões regulares. Basta comparar o valor enviado por POST ou GET com uma matriz. Agora é fácil definir $ arr [$ value_sent_by_form] [0] mantém um valor compatível com PHP, enquanto $ arr [$ value_sent_by_form] [1] valor amigável.
fonte
Veja também este exemplo
fonte
Depois de tentar todas as soluções apresentadas aqui e não estar satisfeito, encontrei um script que corresponde às minhas necessidades e é mais amigável. Para o registro, vou salvá-lo como uma possível solução. Adoro as soluções copiar / colar :)
O script retorna uma seleção com o fuso horário que você deseja pré-selecionado.
Fonte: https://e-tel.eu/2011/07/13/create-a-time-zone-drop-down-list-ddl-in-php/
fonte
Aqui está uma aula que eu montei, misturando o que eu achava que era a melhor de todas as sugestões aqui e com o Carbon como uma dependência:
Você simplesmente
Timezone:all()
, e isso gera uma matriz no formato deUTC-5:00 (America, New York)
, para que você possa exibir facilmente um campo de seleção no seu front-end.fonte
Para aqueles que usam o CodeIgniter, há uma função incorporada do Date Helper chamada timezone_menu . Estes:
Produza a seguinte saída:
fonte
Eu fiz isso:
php -r "echo json_encode(array_combine(DateTimeZone::listIdentifiers(DateTimeZone::ALL), DateTimeZone::listIdentifiers(DateTimeZone::ALL)));" > list-of-timezones.json
fonte
Gostaria de deixar aqui essa ideia:
Obrigado.
fonte
País da América - Hora com a lista de fusos horários em formato de matriz.
Eu o usei em muitos projetos, compartilhando para ajudá-lo. Obrigado por fazer esta pergunta.
fonte