web-dev-qa-db-fra.com

J'ai besoin d'une liste de cartographie des villes aux fuseaux horaires - le meilleur moyen de l'obtenir?

J'ai une liste de villes, d'états/provinces et de pays et j'ai besoin de trouver facilement leurs fuseaux horaires respectifs. Plus précisément, je dois savoir à quelle zone horaire Windows ils correspondent. Jusqu'à présent, cela a été un processus difficile, car il n'y a pas de moyen facile de passer une ville à quelque chose et de récupérer un fuseau horaire (un fuseau horaire étant un décalage et si le fuseau horaire prend en charge l'heure d'été ou non).

Le flux actuel consiste à utiliser http://www.batchgeocode.com pour obtenir la latitude/longitude de la ville (qui appelle vraiment un service Yahoo), puis à appeler http: // www.EarthTools.org pour obtenir une lettre de fuseau horaire, qui correspond à un décalage. Le problème est que le service yahoo retournera parfois une mauvaise longitude/latitude, et earthtools.org ne sait pas grand-chose sur les informations DST, donc le mappage vers l'ID TimeZone correct est un processus manuel fastidieux.

Je ne peux pas être la première personne qui a fait cela - quelqu'un connaît-il une meilleure façon, ou une liste qui contient les informations dont j'ai besoin?

Merci.

52
mhamrah

Question interessante! Ces trois autres SO posts ( 41504 , 55901 et 23702 ) mentionnent quelques pistes. Il y a le base de données Olson (voir la entrée Wikipedia pour la description), mais il semble plus algorithmique/programmatique (par exemple, si vous connaissez un nom de comté, il y a une règle pour certains comtés dans Indiana ).

J'ai essayé de regarder EarthTools mais il échoué pour St.Pierre/Miquelon , l'un des bons cas de test (-3: 00 plutôt le -3: 30 pour Terre-Neuve voisine qui c'est ce que dit EarthTools).

Quelques options prometteuses: worldtimeengine.com a une version interactive gratuite et une API qui semble peu coûteuse (5000 requêtes par livre sterling), mais l'API ne couvre que les requêtes latentes et longues en tant qu'entrées (pas l'emplacement comme entrée, qui est quelque chose que la version interactive a).

Meilleure piste: Je regarderais geonames.org qui semble avoir une belle API riche que vous pourriez utiliser, et ils ont à la fois une version gratuite (lente) et une version commerciale pour de meilleures performances.

p.s. voici quelques bons cas de test (de worldtimezone.com et liste des fuseaux horaires de Wikipedia , le carte des fuseaux horaires est également illustratif):

  • Caracas, Venezuela (-4: 30)
  • Gander, Terre-Neuve (-3: 30)
  • Téhéran, Iran (+3: 30)
  • Kaboul, Afghanistan (+4: 30)
  • Katmandou, Népal (+5: 45)
  • Yangon, Myanmar (+6: 30)
  • Îles Chatham, Nouvelle-Zélande (+12: 45)
  • Île de Pâques (-6)
  • Saint-Pierre et Miquelon (-3)
  • Stanley, Îles Falkland (-4)
  • Evansville, Indiana (-6 = Central)
  • Ontario, Oregon (-7 = Montagne)
37
Jason S

moment-timezone est une bibliothèque JavaScript pour les calculs de fuseau horaire.

Toutes leurs données de fuseau horaire reliant les pays, les fuseaux horaires et les décalages sont toutes disponibles au format json .

2
Tim

Nous utilisons . NET C # MVC et nous avions besoin d'une liste de Fuseau horaire Windows pour chaque pays.

Ainsi, pour chaque utilisateur inscrit, nous pourrions définir le fuseau horaire automatiquement.

La plupart des bases de données en ligne fournissent [~ # ~] iana [~ # ~] fuseaux horaires et il est difficile de les mapper à un pays spécifique.

En utilisant NodaTime nous avons réussi à créer un Json qui répertorie les entrées suivantes.

CountryName
2LetterIsoCountryCode
3LetterIsoCountryCode
IANATimezones
WindowsTimezones

Vous pouvez télécharger le JSON généré ici .

1

Je peux vous aider avec la 2ème partie de votre workflow actuel. J'ai écrit une bibliothèque Java qui mappe les lat/long aux fuseaux horaires, où la base de données est encodée dans le code source.

Le code source est essentiellement un énorme arbre d'instructions if: if (lat> = -33.0) if (lng <-151.5) ... else ... et ainsi de suite. C'est juste une seule classe. Donc, si vous utilisez C #, il serait trivial de le porter.

http://www.edval.biz/mapping-lat-lng-s-to-timezones

Il est précis à 22 km.

0
Tim Cooper