La plupart des sites ont besoin d'un moyen d'afficher les dates sur le site dans le fuseau horaire préféré des utilisateurs. Vous trouverez ci-dessous deux listes que j'ai trouvées, puis une méthode utilisant le PHP DateTime intégré classe à PHP 5.
J'ai besoin d'aide pour savoir lequel de ceux-ci serait le meilleur à utiliser pour essayer d'obtenir le décalage UTC de l'utilisateur inscrit.
Une:
<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 en utilisant des valeurs conviviales 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 simplement en utilisant PHP lui-même:
$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 );
Il semble que le dernier serait le plus sûr car il grandirait avec la version PHP utilisée. Vous pouvez également inverser ce tableau lorsque cela est nécessaire pour lier les fuseaux horaires aux noms de villes.
Réponses:
Je le ferais en PHP, sauf que j'éviterais de faire preg_match 100 quelques fois et que je le ferais pour générer votre liste.
En outre, j'utiliserais les noms de PHP pour les «fuseaux horaires» et oublierais les décalages GMT, qui changeront en fonction de l'heure d'été. Un code comme celui-là dans phpbb n'est que de cette façon, car ils prennent toujours en charge PHP4 et ne peuvent pas compter sur les objets DateTime ou DateTimeZone.
la source
Undefined class constant 'AFRICA'
quand j'essaye d'utiliser la classe DateTimeZone. J'ai vérifié les classes définies et elles sont répertoriées, alors peut-être que Windows a besoin de quelque chose d'autre pour que cela fonctionne.$regions
la valeur1023
remplacerait toutes ces constantes. De plus, si vous avez besoin d'expressions régulières, pensez à lapreg_grep()
place depreg_match()
.DateTimeZone::ALL
au lieu de créer un tableau de régions disponibles et de la parcourir en boucle.En suivant l'exemple de user210179 ci-dessus, j'ai écrit la fonction suivante pour me générer une liste de tous les fuseaux horaires avec leurs décalages:
Cela générera un tableau ressemblant à:
Il est actuellement trié par décalages, mais vous pouvez facilement trier par nom de fuseau horaire en faisant un
ksort()
au lieu deasort()
.la source
$timezones = DateTimeZone::listIdentifiers( DateTimeZone::ALL );
Si vous ne voulez inclure que certaines régions, vous pouvez appeler$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
, je veux les trier commeUTC-11.00,UTC-10.00, ... ,UTC-01.00,UTC+00.00,UTC+01.00, ... ,UTC+13.00,UTC-14.00
array_merge
ne doit pas être utilisé en boucle.Malgré le nombre de réponses existantes, j'ai encore apporté une autre solution à ce problème. Les avantages de ma mise en œuvre sont:
DateTimeZone::listAbbreviations
, car cette méthode renvoie également des informations de fuseau horaire historiques . La réponse de Favio utilise cette méthode, ce qui entraîne des décalages (historiques) incorrectsVoici le code complet:
Et voici un exemple de la sortie
la source
line 73
. Je sais que cela ne peut pas être trop difficile à réaliser, mais je ne peux tout simplement pas comprendre où je suis en retard. Toutes les pensées seraient très appréciées!$timezones = [];
en$timezones = array();
et$offsets = [];
en$offsets = array();
.Je le ferais avec le code suivant qui est similaire à la réponse acceptée (je sais que le code pourrait être refactorisé :)):
Cela produit quelque chose comme:
J'espère que cela vous aidera un peu et / ou vous inspirera à proposer quelque chose de mieux.
la source
$zone['offset'] = $z->getOffset($c);
avant$data[] = $zone;
corrige les décalages affichés.DateTimeZone::listAbbreviations
, pour obtenir une liste correcte des fuseaux horaires.Vous pouvez créer très facilement une liste déroulante à partir de ce tableau (c'était une tâche fastidieuse de l'assembler et de la tester). Nous utilisons déjà cette liste dans certaines de nos applications.
Il est très important de stocker les identifiants de fuseau horaire dans votre base de données et pas seulement le décalage du fuseau horaire comme "GMT + 2", en raison de l'heure d'été.
METTRE À JOUR
J'ai mis à jour / corrigé la liste des fuseaux horaires (également checkout: https://github.com/paptamas/timezones ):
la source
Modifier la réponse de Tamas pour supprimer toutes les "autres" entrées qui, selon le site php.net, ne devraient plus être utilisées.
Peut-être n'a pas d'importance, mais suivez simplement les meilleures pratiques. Voir l'avis au bas de: http://fr2.php.net/manual/en/timezones.others.php
Aussi, bien que cette liste ait les Açores comme GMT -1, en fait, je pense que c'est la même chose (au moins parfois) que GMT, mais pas sûr.
Modification pour offrir cela dans SQL afin que vous puissiez créer la liste déroulante dans un formulaire et que la réponse de l'utilisateur soit liée à un index à la place.
Modifier à nouveau pour supprimer l'espace de début
la source
En voici un qui crée un tableau multidimensionnel trié par décalage et nom gentilifié:
Échos:
la source
la source
Utiliser listAbbreviations () n'a aucun sens car pour chaque zone, il renvoie tous les différents décalages qui y étaient historiquement utilisés, pas seulement ceux actuels. La bonne source de base de la liste est certainement listIdentifiers ().
Je générerais la liste une seule fois et la sauvegarderais pour éviter de la générer pour chaque demande. Je pourrais le rafraîchir une fois par mois.
De plus, je pourrais mettre toutes les informations sur les fuseaux horaires dans un script js séparé et générer la liste de sélection elle-même côté client. Le script js pourrait également être mis en cache, les fuseaux horaires ne changent pas souvent.
En outre, en utilisant javascript côté client, vous pouvez connaître l'heure locale actuelle, et par conséquent, vous pouvez trouver les zones qui ont la même heure maintenant (les minutes peuvent différer, donc la comparaison doit être approximative), et les afficher en haut de la list, donc l'utilisateur n'a pas à faire défiler tous les 400 éléments. Vous pouvez également afficher les zones adjacentes (+/- 1 heure) à la suite.
la source
Je sais que cela a déjà une réponse, mais j'ai vu une opportunité d'améliorer l'une des réponses ici. Toland H a publié un très bon code qui fait exactement ce que la question demandait. Vous trouverez ci-dessous une version abrégée et étendue du code de Toland H:
Ensuite, tout ce que vous avez à faire est de faire écho à ce qui est renvoyé entre vos balises de sélection html. Vous obtiendrez une liste de sélection quelque chose comme ceci:
Etc...
la source
Cette fonction PHP fait le travail à votre place et rend un tableau:
Cette fonction PHP renvoie un tableau de tous les fuseaux horaires existants, y compris Offset:
Utilisez-le par exemple comme ceci:
la source
Je voulais avoir quelque chose de plus simple pour mes utilisateurs, comme Google le fait.
Cela me donne un tableau regroupé par pays:
Ce qui signifie que maintenant je peux faire quelque chose comme ci-dessous (bien sûr avec une astuce javaScript):
la source
Dans certains projets, cela n'a vraiment pas de sens d'avoir les fuseaux horaires détaillés de l'Afrique, de l'Europe ou du Pacifique. Voici donc une version courte
cela générera une sélection comme ci-dessous:
la source
Tada! C'est aussi simple que ça. Vous donne un tableau avec la clé comme fuseau horaire PHP et la valeur sous forme de chaîne au format + -Hours: Minutes
la source
J'ai créé une classe PHP pour cela avec un plugin jQuery correspondant. Je l'ai open-source sur https://github.com/peterjtracey/timezoneWidget - le code PHP est inspiré d'une autre réponse stackoverflow, mais je pense beaucoup plus élégant. Le plugin jQuery offre une excellente interface pour sélectionner un fuseau horaire.
la source
Variante 1
Résultat:
Code:
Variante 2
Résultat:
Code:
la source
la première option vous permettrait de prendre la valeur de $ _POST ['whateveryoucalltheselect'] et de l'ajouter à UTC. ou même stocker cette valeur et appeler toujours UTC + userTZsetting chaque fois que vous en aurez besoin plus tard. me semble le plus simple. la dernière option serait beaucoup plus intéressante si les fuseaux horaires changeaient fréquemment.
la source
Aucun d'entre eux. Préparez plutôt un tableau en PHP avec ces fuseaux horaires. Comme
ou
etc. Puis générez un formulaire basé sur ce tableau:
Et puis, vous pouvez facilement basculer entre différents formats en modifiant simplement le code dans la ligne ci-dessus. La validation sera également beaucoup plus facile et ne nécessitera pas d'expressions régulières. Comparez simplement la valeur envoyée par POST ou GET avec un tableau. Maintenant, il est facile de définir $ arr [$ value_sent_by_form] [0] contient une valeur compatible PHP tandis que $ arr [$ value_sent_by_form] [1] valeur conviviale.
la source
Voir aussi cet exemple
la source
Après avoir essayé toutes les solutions présentées ici et ne pas être satisfait, j'ai trouvé un script qui correspond à mes besoins et il est plus convivial. Pour mémoire, je vais l'enregistrer comme solution possible. J'adore les solutions copier / coller :)
Le script renvoie une sélection avec le fuseau horaire que vous souhaitez présélectionner.
Source: https://e-tel.eu/2011/07/13/create-a-time-zone-drop-down-list-ddl-in-php/
la source
Voici une classe que j'ai mise en place, mélangeant ce que je pensais être la meilleure de toutes les suggestions ici, et avec Carbon en tant que dépendance:
Vous simplement
Timezone:all()
, et cela vous donne un tableau au format deUTC-5:00 (America, New York)
, de sorte que vous pouvez facilement afficher un champ de sélection sur votre frontend.la source
Pour ceux qui utilisent CodeIgniter, il existe une fonction d'aide de date intégrée appelée timezone_menu . Celles-ci:
Produisez la sortie suivante:
la source
J'ai fait ça:
php -r "echo json_encode(array_combine(DateTimeZone::listIdentifiers(DateTimeZone::ALL), DateTimeZone::listIdentifiers(DateTimeZone::ALL)));" > list-of-timezones.json
la source
Je voudrais laisser ici cette idée:
Je vous remercie.
la source
Pays d'Amérique - Heure avec liste des fuseaux horaires au format Array.
Je l'ai utilisé dans de nombreux projets, partageant pour vous aider. Merci d'avoir posé cette question.
la source