web-dev-qa-db-fra.com

Mappage du code postal américain sur le fuseau horaire

Lorsque les utilisateurs s'enregistrent avec notre application, nous pouvons déduire leur code postal lorsque nous les validons sur une base de données nationale. Quel serait le meilleur moyen de déterminer une estimation potentielle de leur fuseau horaire à partir de ce code postal?

Nous essayons de minimiser la quantité de données que nous devons explicitement leur demander. Ils pourront définir manuellement le fuseau horaire ultérieurement si notre meilleure estimation est fausse. Je me rends compte que les codes postaux ne nous aideront pas à déterminer le fuseau horaire en dehors des États-Unis, mais dans ce cas, nous devrions quand même demander manuellement, et nous traitons principalement avec les États-Unis.

J'ai trouvé beaucoup de bases de données de codes postaux, et jusqu'à présent, seules quelques-unes contiennent des informations de fuseau horaire, mais celles qui le sont ne sont pas gratuites, comme celui-ci . S'il est absolument nécessaire de payer un abonnement à un service pour le faire, cela ne vaudra pas la peine et nous devrons simplement demander explicitement aux utilisateurs.

Bien que la langue ne soit pas particulièrement pertinente car je peux probablement convertir les choses dont vous avez besoin, nous utilisons PHP et MySQL.

77
Doug Kavendek

Je viens de trouver une base de données Zip libre qui inclut le décalage horaire et la participation à DST. J'aime bien la réponse d'Erik J, car cela m'aiderait à choisir le fuseau horaire plutôt que juste le décalage (car on ne peut jamais être tout à fait sûr des règles), mais je pense que je pourrais commencer par ceci et le faire essayer trouvez le meilleur fuseau horaire en fonction de la configuration offset/dst. Je pense que je peux essayer de mettre en place une version simple de la réponse de Development 4.0 pour vérifier par rapport à ce que je tire de l'info Zip comme test de cohérence. Ce n'est certainement pas aussi simple que je l'espérais, mais une combinaison devrait me permettre de connaître au moins 90% du fuseau horaire d'un utilisateur.

37
Doug Kavendek

La plupart des États se trouvent dans un fuseau horaire unique (à quelques exceptions près). La plupart des codes postaux ne traversent pas les frontières des États (à quelques exceptions près).

En combinant ces faits, vous pouvez rapidement créer votre propre liste de fuseaux horaires par Zip.

Voici une liste de plages de code postal par état , et une liste de états par fuseau horaire .

Vous pouvez voir les limites des codes postaux et les comparer à la carte du fuseau horaire à l'aide de ce lien , ou de Google Earth, pour mapper des zips sur des fuseaux horaires pour les États divisés par une ligne de fuseau horaire. 

La majorité des pays non américains avec lesquels vous traitez se trouvent probablement dans un fuseau horaire précis. Vous voudrez peut-être regarder d'où proviennent vos N principaux visiteurs non américains et consulter leur fuseau horaire.

24
Eric J.

J'ai créé une table de base de données MySQL Open-Source (sous licence MIT) qui référence les codes postaux et les fuseaux horaires, puis je l'ai téléchargée sur sourceforge.net:

http://sourceforge.net/projects/Zip2timezone/files/

Il provient de quatre emplacements (API principale de Yahoo PlaceFinder - merci @Chris N)

Consultez le fichier README pour plus d'informations et d'instructions.

10
chriv

Si vous le souhaitez, vous pouvez également avoir une idée du fuseau horaire en demandant au navigateur que Josh Fraser a ne belle écriture à ce sujet ici

var rightNow = new Date();
var jan1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
var temp = jan1.toGMTString();
var jan2 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
var std_time_offset = (jan1 - jan2) / (1000 * 60 * 60);

La deuxième chose que vous devez savoir est de savoir si l'emplacement observe l'heure avancée (DST) ou non. Etant donné que l'heure d'été est toujours observée pendant l'été, nous pouvons comparer le décalage horaire entre deux dates en janvier et le décalage horaire entre deux dates en juin. Si les décalages sont différents, nous savons que l'emplacement observe l'heure d'été. Si les décalages sont les mêmes, alors nous savons que l'emplacement NE PAS observer l'heure d'été.

var june1 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0);
temp = june1.toGMTString();
var june2 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
var daylight_time_offset = (june1 - june2) / (1000 * 60 * 60);
var dst;
if (std_time_offset == daylight_time_offset) {
    dst = "0"; // daylight savings time is NOT observed
} else {
    dst = "1"; // daylight savings time is observed
}

Tout le mérite en revient à Josh Fraser.

Cela pourrait vous aider avec des clients hors des États-Unis et compléter votre approche Zip.

Voici une SO question qui concerne l'obtention du fuseau horaire à partir de javascript

8
Development 4.0

Google dispose d'une API spécifique à cet effet: https://developers.google.com/maps/documentation/timezone/

exemple: https://maps.googleapis.com/maps/api/timezone/json?location=40.704822,-74.0137431&timestamp=0

{
  dstOffset: 0,
  rawOffset: -18000,
  status: "OK",
  timeZoneId: "America/New_York",
  timeZoneName: "Eastern Standard Time"
}

Ils nécessitent un horodatage Unix sur la chaîne de requête. D'après la réponse renvoyée, il semble que timeZoneName prenne en compte l'heure d'été, en fonction de l'horodatage, alors que timeZoneId est un nom indépendant de l'heure d'été pour le fuseau horaire.

Pour mon utilisation, en Python, je ne fais que transmettre timestamp=0 et utiliser la valeur timeZoneId pour obtenir un objet tz_info à partir de pytz , je peux ensuite l'utiliser pour localiser une date/heure particulière dans mon propre code.

Je crois que pour PHP, vous pouvez également trouver "America/New_York" dans http://pecl.php.net/package/timezonedb

5
Anentropic

Ruby gem pour convertir le code postal en fuseau horaire: https://github.com/Katlean/TZip (créé depuis https://github.com/farski/TZip ).

> ActiveSupport::TimeZone.find_by_zipcode('90029')
 => "Pacific Time (US & Canada)"

C'est rapide, petit et n'a pas de dépendances externes, mais gardez à l'esprit que les codes postaux ne correspondent pas parfaitement aux fuseaux horaires.

4
mkirk

J'ai récemment fait un hachage Ruby de tous les codes postaux aux États-Unis et de leurs fuseaux horaires associés que vous pourriez utiliser si vous êtes intéressé. Devrait être assez facile à désosser pour vos besoins.

2
peterhurford

J'ai travaillé sur ce problème pour mon propre site et j'ai l'impression d'avoir trouvé une très bonne solution

1) Attribuer des fuseaux horaires à tous les états avec un seul fuseau horaire (la plupart des états)

et puis soit

2a) utilisez la solution js ( Javascript/PHP et les fuseaux horaires ) pour les états restants

ou

2b) utilisez une base de données telle que celle liée ci-dessus par @Doug.

De cette façon, vous pouvez trouver tz à moindre coût (et avec une grande précision!) Pour la majorité de vos utilisateurs, puis utiliser l’une des méthodes plus coûteuses pour l’obtenir pour le reste des États.

Pas très élégant, mais me semblait meilleur que d’utiliser js ou une base de données pour chaque utilisateur.

1
Matt Parrilla

Il existe en fait une excellente API Google pour cela. Il prend dans un emplacement et retourne le fuseau horaire pour cet emplacement. Devrait être assez simple pour créer un script bash ou python afin d’obtenir les résultats pour chaque adresse dans un fichier CSV ou une base de données, puis enregistrer les informations de fuseau horaire.

https://developers.google.com/maps/documentation/timezone/start

Requête Endpoint:

https://maps.googleapis.com/maps/api/timezone/json?location=38.908133,-77.047119&timestamp=1458000000&key=YOUR_API_KEY

Réponse:

{
   "dstOffset" : 3600,
   "rawOffset" : -18000,
   "status" : "OK",
   "timeZoneId" : "America/New_York",
   "timeZoneName" : "Eastern Daylight Time"
}
1
Anonmily
1
joe snyder

Notez également que si vous utilisez le service de géocodage Yahoo, vous pouvez obtenir des informations de fuseau horaire renvoyées en définissant le drapeau correct.

http://developer.yahoo.com/geo/placefinder/guide/requests.html#flags-parameter

1
Chris N

En plus de la réponse de Doug Kavendek. On pourrait utiliser l'approche suivante pour se rapprocher de tz_database.

  1. Télécharger [Base de données de code postal gratuite Latitude et Longitude]
  2. Télécharger [Un fichier de formes des fuseaux horaires TZ du monde]
  3. Utilisez n’importe quelle bibliothèque libre pour l’interrogation de fichiers de formes (par exemple, .NET Easy GIS .NET , LGPL).
 var shapeFile = new ShapeFile (shapeFilePath); 
 var shapeIndex = shapeFile.GetShapeIndexContainingPoint (nouveau PointD (long, lat), 0D); 
 var attrValues ​​= shapeFile.GetAttributeFieldValues ​​(shapeIndex); 
 var timeZoneId = attrValues ​​[0]; 

P.S. Impossible d'insérer tous les liens :( Alors s'il vous plaît utiliser la recherche.

1
Dmitriy Zubrilin

Cela téléchargera un fichier yaml qui mappera tous les fuseaux horaires sur un tableau de leurs codes postaux:

curl https://Gist.githubusercontent.com/anonymous/01bf19b21da3424f6418/raw/0d69a384f55c6f68244ddaa07e0c2272b44cb1de/timezones_to_zipcodes.yml > timezones_to_zipcodes.yml

par exemple.

"Eastern Time (US & Canada)" => ["00100", "00101", "00102", "00103", "00104", ...]
"Central Time (US & Canada)" => ["35000", "35001", "35002", "35003", "35004", ...]
etc...

Si vous préférez les fuseaux horaires raccourcis, vous pouvez exécuter celui-ci:

curl https://Gist.githubusercontent.com/anonymous/4e04970131ca82945080/raw/e85876daf39a823e54d17a79258b170d0a33dac0/timezones_to_zipcodes_short.yml > timezones_to_zipcodes.yml

par exemple.

"EDT" => ["00100", "00101", "00102", "00103", "00104", ...]
"CDT" => ["35000", "35001", "35002", "35003", "35004", ...]
etc...
0
BananaNeil

Je gère une API appelée Zipgenius qui utilise les données fournies par @chriv fournies ci-dessus. N'hésitez pas à l'utiliser pour vos propres besoins.

0
andrewhao