Mappatura del codice postale degli Stati Uniti al fuso orario [chiuso]


84

Quando gli utenti si registrano con la nostra app, siamo in grado di dedurre il loro codice postale quando li convalidiamo rispetto a un database nazionale. Quale sarebbe il modo migliore per determinare una buona ipotesi potenziale del loro fuso orario da questo codice postale?

Stiamo cercando di ridurre al minimo la quantità di dati che dobbiamo chiedergli esplicitamente. Saranno in grado di impostare manualmente il fuso orario in un secondo momento se la nostra ipotesi migliore è sbagliata. Mi rendo conto che i codici postali non aiuteranno a capire il fuso orario al di fuori degli Stati Uniti, ma in tal caso dovremmo comunque chiedere manualmente e trattiamo prevalentemente con gli Stati Uniti a prescindere.

Ho trovato molti database di codici postali e finora solo pochi contengono informazioni sul fuso orario, ma quelli che non sono gratuiti, come questo . Se è assolutamente necessario pagare un abbonamento a un servizio per farlo, allora non ne varrà la pena e dovremo solo chiedere esplicitamente agli utenti.

Sebbene la lingua non sia particolarmente rilevante in quanto probabilmente posso convertire le cose comunque necessarie, stiamo usando PHP e MySQL.


2
+1 per la domanda su come indovinare
Chris McCall

Risposte:


37

Ho appena trovato un database zip gratuito che include la differenza di orario e la partecipazione all'ora legale. Mi piace la risposta di Erik J, in quanto mi aiuterebbe a scegliere il fuso orario effettivo anziché solo l'offset (perché non puoi mai essere completamente sicuro delle regole), ma penso che potrei iniziare con questo e fargli provare a trova la migliore corrispondenza del fuso orario in base alla configurazione offset / dst. Penso di poter provare a configurare una versione semplice della risposta di Development 4.0 per verificare ciò che ottengo dalle informazioni zip come test di sanità mentale. Sicuramente non è così semplice come spero, ma una combinazione dovrebbe rendermi sicuro almeno al 90% del fuso orario di un utente.


@Doug: Tutto ciò che riguarda la GeoCoding non sarà mai corretto al 100%, tanto più quando agisci solo a livello ZIP. Tuttavia, se puoi essere corretto oltre il 90% delle volte, probabilmente sarà un vantaggio per i tuoi utenti. La cosa peggiore che potresti essere fuori è un'ora.
Eric J.

3
attenzione, i database zip gratuiti sono quasi sempre obsoleti, poiché il servizio postale cambia quel file mensilmente. vedi anche semaphorecorp.com/cgi/zip5.html
joe snyder

Quel collegamento fa emergere alcuni punti positivi, ma poiché lo sto usando solo per fare un'ipotesi sulla regione generale (e consentendo le correzioni), non dovrei preoccuparmi troppo. A meno che un codice postale non possa essere a cavallo di più fusi orari, ma in tal caso è già un caso limite e poiché non chiederemo mai gli indirizzi degli utenti non saremo in grado di utilizzarli per convalidare ulteriormente. Ma in effetti, probabilmente sarebbe utile per noi abbonarci effettivamente a uno prima che le cose vadano in diretta, per tenerci aggiornati. Quello gratuito è almeno buono per i test.
Doug Kavendek,

2
@joesnyder Link è rotto, potresti aggiornare o almeno spiegare cosa c'era?
dlsso


26

La maggior parte degli stati si trova esattamente in un fuso orario (sebbene ci siano alcune eccezioni). La maggior parte dei codici postali non attraversa i confini di stato (sebbene ci siano alcune eccezioni).

Potresti creare rapidamente il tuo elenco di fusi orari per zip combinando questi dati.

Ecco un elenco di intervalli di codici postali per stato e un elenco di stati per fuso orario .

Puoi vedere i confini dei codici postali e confrontarli con la mappa del fuso orario utilizzando questo link , o Google Earth, per mappare le zip sui fusi orari per gli stati divisi da una linea del fuso orario.

La maggior parte dei paesi non statunitensi con cui hai a che fare probabilmente si trova esattamente in un fuso orario (di nuovo, ci sono delle eccezioni). A seconda delle tue esigenze, potresti voler guardare da dove provengono i tuoi primi N visitatori non statunitensi e cercare il loro fuso orario.


1
Wow, quali sono le eccezioni?
Hamish Grubijan

5
@Hamish: Eccezioni per stati in più fusi orari che puoi vedere nel link di Wikipedia (stati per fuso orario). Il mio collega sta mappando gli ZIP agli stati mentre parliamo e si è imbattuto in alcuni ZIP che attraversano i confini di stato. Un esempio è 42223.
Eric J.

2
Si noti inoltre che alcuni stati ( credo solo Arizona e Hawaii ) non osservano l'ora legale.
Jon-Eric

1
Gli stati nel nord-ovest degli Stati Uniti hanno un milione e un codice postale per stato; giusto avvertimento.
Qix - MONICA È STATA MALTRATTATA

1
È molto di più di poche eccezioni. Timetemperature.com/tzus/indiana_time_zone.shtml
Chris Moschini

12

Ho creato una tabella di database MySQL open source (con licenza MIT) che fa riferimento a codici postali e fusi orari e l'ho caricata su sourceforge.net:

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

Proviene da quattro posizioni (API Yahoo PlaceFinder primaria - grazie @Chris N)

Vedere il file README per ulteriori informazioni e istruzioni.


Hai ancora il codice che lo ha generato? Ormai sono passati alcuni anni e spero di ottenere un nuovo set di dati.
Billy

8

Se vuoi, puoi anche avere un'idea del fuso orario chiedendo al browser che Josh Fraser ha una bella scrittura qui

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 seconda cosa che devi sapere è se il luogo osserva l'ora legale (DST) o meno. Poiché l'ora legale viene sempre osservata durante l'estate, possiamo confrontare la differenza di orario tra due date di gennaio con la differenza di orario tra due date di giugno. Se gli offset sono diversi, sappiamo che la posizione osserva l'ora legale. Se gli offset sono gli stessi, sappiamo che la posizione NON osserva l'ora legale.

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
}

Tutto il merito va a Josh Fraser.

Questo potrebbe aiutarti con i clienti al di fuori degli Stati Uniti e potrebbe completare il tuo approccio zip.

Ecco una domanda SO che tocca come ottenere il fuso orario da javascript


1
Grazie! Come Josh menziona sul suo sito, Jon Nylander ha "scritto una soluzione più robusta. Usa invece la sua versione". La sua versione è qui: bitbucket.org/pellepim/jstimezonedetect
Brad Parks,

6

Google ha un'API specifica per questo: https://developers.google.com/maps/documentation/timezone/

ad esempio: https://maps.googleapis.com/maps/api/timezone/json?location=40.704822,-74.0137431×tamp=0

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

Richiedono un timestamp unix sulla stringa di query. Dalla risposta restituita risulta che timeZoneNameprende in considerazione l'ora legale, in base al timestamp, mentre timeZoneIdè un nome indipendente dall'ora legale per il fuso orario.

Per il mio uso, in Python, sto solo passando timestamp=0e usando il timeZoneIdvalore per ottenere un tz_infooggetto da pytz , posso quindi usarlo per localizzare un particolare datetime nel mio codice.

Credo che per PHP allo stesso modo puoi trovare "America / New_York" in http://pecl.php.net/package/timezonedb


4
Tieni presente che la licenza per l'API di geocodifica di Google richiede di utilizzare i risultati per la visualizzazione su una mappa ...
Josh

@ Josh Stai dicendo che non posso utilizzare l'API di geocodifica per acquisire una posizione allo scopo di determinare il fuso orario in quella posizione?
Cruncher

2
Dalla pagina delle norme: "Puoi visualizzare i risultati dell'API del fuso orario su una mappa di Google o senza una mappa. Se desideri visualizzare i risultati dell'API del fuso orario su una mappa, questi risultati devono essere visualizzati su una mappa di Google. È vietato per utilizzare i dati dell'API del fuso orario su una mappa che non è una mappa di Google. " Developers.google.com/maps/documentation/timezone/policies
tmorell

4

Ruby gem per convertire il codice postale in fuso orario: https://github.com/Katlean/TZip (biforcato da https://github.com/farski/TZip ).

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

È veloce, piccolo e non ha dipendenze esterne, ma tieni presente che i codici postali non si mappano perfettamente ai fusi orari.


1
Sia il TZip originale che la forcella di Katlean sono buoni, ma non precisi al 100%. Alcuni codici postali (probabilmente introdotti negli ultimi anni) non vengono considerati.
bigtex777

1

Ho lavorato a questo problema per il mio sito e mi sento come se avessi trovato una buona soluzione

1) Assegna fusi orari a tutti gli stati con un solo fuso orario (la maggior parte degli stati)

e poi neanche

2a) utilizzare la soluzione js ( Javascript / PHP e fusi orari ) per gli stati rimanenti

o

2b) usa un database come quello collegato sopra da @Doug.

In questo modo, puoi trovare tz a buon mercato (e molto accuratamente!) Per la maggior parte dei tuoi utenti e quindi utilizzare uno degli altri metodi più costosi per ottenerlo per il resto degli stati.

Non super elegante, ma mi è sembrato meglio che usare js o un database per ogni utente.


1

Oltre alla risposta di Doug Kavendek. Si potrebbe usare il seguente approccio per avvicinarsi a tz_database.

  1. Scarica [database gratuito di latitudine e longitudine del codice postale]
  2. Scarica [Uno shapefile dei fusi orari TZ del mondo]
  3. Utilizzare qualsiasi libreria gratuita per l'interrogazione di shapefile (ad esempio .NET Easy GIS .NET , LGPL).
    var shapeFile = new ShapeFile (shapeFilePath);
    var shapeIndex = shapeFile.GetShapeIndexContainPoint (new PointD (long, lat), 0D);
    var attrValues ​​= shapeFile.GetAttributeFieldValues ​​(shapeIndex);
    var timeZoneId = attrValues ​​[0];

PS Non riesco a inserire tutti i link :( Quindi usa la ricerca.


1

Questo scaricherà un file yaml che mapperà tutti i fusi orari su un array dei loro codici postali:

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

per esempio

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

Se preferisci i fusi orari ridotti, puoi eseguire questo:

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

per esempio

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

1
Ciò include 96941 (Micronesia) come nell'ora del Pacifico e include 83500 come codice postale nell'ora del Pacifico, ma non credo che esista negli Stati Uniti. Come sono stati creati i dati?
Justin Blank



0

In realtà c'è un'ottima API di Google per questo. Prende una posizione e restituisce il fuso orario per quella posizione. Dovrebbe essere abbastanza semplice creare uno script bash o python per ottenere i risultati per ogni indirizzo in un file CSV o database, quindi salvare le informazioni sul fuso orario.

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

Richiesta endpoint:

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

Risposta:

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

va notato che l'API è di $ 5 per 1k chiamate.
FlyingZebra1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.