2010-03-16 5 views
71

Wenn sich Nutzer bei unserer App registrieren, können wir ihre Postleitzahl ableiten, wenn wir sie anhand einer nationalen Datenbank validieren. Was wäre der beste Weg, um aus dieser Postleitzahl eine gute potentielle Schätzung ihrer Zeitzone zu ermitteln?Zuordnung der US-Postleitzahl zur Zeitzone

Wir versuchen, die Menge der Daten zu minimieren, die wir ihnen explizit stellen müssen. Sie können die Zeitzone später manuell einstellen, wenn unsere beste Vermutung falsch ist. Ich weiß, dass Postleitzahlen nicht helfen werden, die Zeitzone außerhalb der USA herauszufinden, aber in diesem Fall müssten wir sowieso manuell fragen, und wir beschäftigen uns in erster Linie mit den USA.

Ich habe viele Postleitzahlen-Datenbanken gefunden, und bis jetzt enthalten nur einige Zeitzonen-Informationen, aber diejenigen, die tun, sind nicht frei, wie this one. Wenn es absolut notwendig ist, ein Abonnement für einen Dienst zu bezahlen, um dies zu tun, dann wird es sich nicht lohnen und wir werden die Benutzer nur explizit fragen müssen.

Obwohl Sprache ist nicht besonders relevant, da ich wahrscheinlich Dinge konvertieren kann, wie auch immer benötigt, verwenden wir PHP und MySQL.

+2

+1 für Fragen zum Raten –

Antwort

31

Ich habe gerade ein free zip database, die Zeit in DST-Offset und die Teilnahme beinhaltet. Ich mag die Antwort von Erik J., da es mir hilft, die tatsächliche Zeitzone zu wählen, anstatt nur den Offset (weil man sich bei den Regeln nie völlig sicher sein kann), aber ich denke, ich könnte damit beginnen und es versuchen lassen Finden Sie die beste Zeitzonenübereinstimmung basierend auf der Offset/dst-Konfiguration. Ich denke, ich werde versuchen, eine einfache Version von Development 4 zu erstellen.Antwort von 0, um zu überprüfen, was ich von den Zip-Informationen als ein Gesundheitstest bekomme. Es ist definitiv nicht so einfach, wie ich hoffe, aber eine Kombination sollte mir mindestens 90% der Zeitzone eines Benutzers sicher sein.

+0

@Doug: Alles, was mit GeoCoding zusammenhängt, wird nie 100% korrekt sein, umso mehr, wenn Sie nur auf ZIP-Ebene handeln. Dennoch, wenn Sie zu 90% der Zeit korrekt sein können, wird es wahrscheinlich ein Vorteil für Ihre Benutzer sein. Am schlimmsten ist es, dass Sie eine Stunde weg sind. –

+3

Vorsicht, kostenlose Zip-Datenbanken sind fast immer veraltet, da der Postdienst diese Datei monatlich ändert. siehe auch http://semaphorecorp.com/cgi/zip5.html –

+0

Dieser Link bringt einige gute Punkte, aber da ich nur dies benutze, um die allgemeine Region zu erraten (und Korrekturen zuzulassen), sollte ich nicht Ich muss mir zu viele Sorgen machen. Es sei denn, eine Postleitzahl kann mehrere Zeitzonen umfassen - aber in diesem Fall ist es bereits ein Randfall, und da wir nie nach Adressen von Benutzern fragen werden, können wir diese nicht zur weiteren Validierung verwenden. Aber in der Tat wäre es wahrscheinlich nützlich für uns, einen zu abonnieren, bevor die Dinge live gehen, um up-to-date zu bleiben. Der freie ist zumindest gut zum Testen. –

25

Die meisten Zustände sind in genau einer Zeitzone (obwohl es ein paar Ausnahmen gibt). Die meisten Postleitzahlen überschreiten keine Ländergrenzen (obwohl es einige Ausnahmen gibt).

Sie könnten schnell eine eigene Liste von Zeitzonen per Zip erstellen, indem Sie diese Fakten kombinieren.

Hier ist eine Liste von zip code ranges per state und eine Liste von states per time zone.

Sie können die Grenzen von Postleitzahlen anzeigen und mit der Zeitzonenkarte vergleichen, indem Sie this link oder Google Earth verwenden, um Zeitreihen für die durch eine Zeitzonenlinie getrennten Status zu zippen.

Die meisten Nicht-US-Länder, mit denen Sie zu tun haben, befinden sich wahrscheinlich in genau einer Zeitzone. Vielleicht möchten Sie sich ansehen, woher Ihre Top-N-Besucher außerhalb der USA kommen und nur nach ihrer Zeitzone suchen.

+1

Wow, was sind die Ausnahmen? –

+4

@Hamish: Ausnahmen für Staaten in mehreren Zeitzonen können Sie in der Wikipedia-Link (Staaten pro Zeitzone) sehen. Mein Kollege ordnet ZIPs den Zuständen zu, während wir sprechen, und stieß auf einige ZIPs, die die Statuszeilen kreuzen. Ein Beispiel ist 42223. –

+0

Von dem, was ich weiß, Montana, ORegon, Idaho, Dakota, Nebraska, Kansas, Texas, und einige der mittleren östlichen Staaten – dassouki

8

Wenn Sie möchten, können Sie auch ein Gefühl für die Zeitzone erhalten, indem Sie den Browser fragen Josh Fraser hat a nice write up on it here

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); 

Die zweite Sache, die Sie wissen müssen, ist, ob der Standort Sommerzeit beobachtet (DST) oder nicht. Da DST immer im Sommer beobachtet wird, können wir den Zeitversatz zwischen zwei Daten im Januar mit dem Zeitversatz zwischen zwei Daten im Juni vergleichen. Wenn die Offsets unterschiedlich sind, wissen wir, dass der Standort DST beobachtet. Wenn die Offsets gleich sind, wissen wir, dass der Standort DST NICHT beobachtet.

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 
} 

Alle Anerkennung dafür geht an Josh Fraser.

Dies könnte Ihnen bei Kunden außerhalb der USA helfen, und es könnte Ihre Zip-Ansatz ergänzen.

Here is a SO questions that touch on getting the timezone from javascript

+0

+1 Server-Side wäre schöner, aber ich mag die JS-Lösung :) – Basic

+0

danke! Wie Josh auf seiner Seite erwähnt, hat Jon Nylander "eine robustere Lösung geschrieben. Benutze stattdessen seine Version." Seine Version ist hier: https://bitbucket.org/pellepim/jstimezonedetect –

1

Ich habe auf diesem Problem für meine eigene Website zu arbeiten und das Gefühl, dass ich mit einer ziemlich guten Lösung zu kommen habe

1) mit einer Zeitzone nur Zeitzonen für alle Staaten vergeben (die meisten Staaten)

und dann entweder

2a) verwenden, um die Lösung js (Javascript/PHP and timezones) für die übrigen Zustände

oder

2b) verwenden, eine Datenbank wie die oben von @Doug verlinkte.

Auf diese Weise können Sie Tz billig (und sehr genau!) Für die Mehrheit Ihrer Benutzer finden und dann eine der anderen, teureren Methoden verwenden, um es für den Rest der Staaten zu bekommen.

Nicht super elegant, aber schien mir besser als js oder eine Datenbank für jeden einzelnen Benutzer.

9

habe ich eine Open-Source (MIT-Lizenz) Tabelle MySQL-Datenbank mit Querverweisen auf Codes und Zeitzonen zip und lud es auf sourceforge.net:

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

Es ist sourced von vier Standorten (primäre Yahoo PlaceFinder API - danke @Chris N)

Siehe die README-Datei für weitere Informationen und Anweisungen.

4

Ruby Juwel, um Postleitzahl in Zeitzone zu konvertieren: https://github.com/Katlean/TZip (gespalten von https://github.com/farski/TZip).

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

Es ist schnell, klein und hat keine externen Abhängigkeiten, aber denken Sie daran, die Codes nur zip Karte nicht perfekt zu Zeitzonen.

+1

Sowohl die Original TZip und Katlean Gabel sind gut, aber nicht 100% genau. Einige Postleitzahlen (die wahrscheinlich in den letzten Jahren eingeführt wurden) werden nicht berücksichtigt. – bigtex777

5

Google hat eine spezifische API dafür: https://developers.google.com/maps/documentation/timezone/

zB: 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" 
} 

Sie benötigen einen Unix-Zeitstempel auf dem Abfragezeichenfolgeflag. Von der zurückgegebenen Antwort scheint es, dass timeZoneName die Sommerzeit basierend auf dem Zeitstempel berücksichtigt, während timeZoneId ein DST-unabhängiger Name für die Zeitzone ist.

Für meine Anwendung in Python, ich vorbei nur timestamp=0 und mit dem timeZoneId Wert ein tz_info Objekt von pytz zu bekommen, dann kann ich das verwendet einen bestimmten Datetime in meinem eigenen Code zu lokalisieren.

ich für PHP glauben ähnlich können Sie "Amerika/New_York" in http://pecl.php.net/package/timezonedb

+4

Beachten Sie, dass die Lizenzierung für Geokodierungs-API von Google erfordert, dass Sie die Ergebnisse für die Anzeige auf einer Karte verwenden ... – Josh

1

Neben Doug Kavendek Antwort finden. Man könnte den folgenden Ansatz verwenden, um tz_database näher zu kommen.

  1. herunterladen [Free Postleitzahl Breite und Länge Database]
  2. herunterladen [A Shape-Datei der TZ Zeitzonen der Welt]
  3. Verwenden jede freie Bibliothek für Shape-Datei Abfrage (z .NET Easy GIS .NET, LGPL).
 
    var shapeFile = new ShapeFile(shapeFilePath); 
    var shapeIndex = shapeFile.GetShapeIndexContainingPoint(new PointD(long, lat), 0D); 
    var attrValues = shapeFile.GetAttributeFieldValues(shapeIndex); 
    var timeZoneId = attrValues[0]; 

P. S. Kann nicht alle Links einfügen :(Also bitte Suche.

0

werden daraufhin heruntergeladen ein YAML-Datei, die alle Zeitzonen auf ein Array von ihrer zipcodes abbildet:

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

zB

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

Wenn Sie die verkürzte Zeitzonen bevorzugen, y Sie können dieses Verfahren ausführen:

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

z.

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

Dies umfasst 96941 (Mikronesien) als Pacific Time und enthält 83500 als Postleitzahl in Pacific Time, aber ich tue glaube nicht, dass es in den Vereinigten Staaten existiert. Wie wurden die Daten erstellt? –

1

Es gibt tatsächlich eine großartige Google API dafür. Es nimmt einen Ort auf und gibt die Zeitzone für diesen Ort zurück. Sollte einfach genug sein, um ein Bash- oder Python-Skript zu erstellen, um die Ergebnisse für jede Adresse in einer CSV-Datei oder Datenbank zu erhalten, dann speichere die Zeitzoneninformationen.

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

Anfrage Endpunkt:

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

Antwort:

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

ich pflegen eine zipcode-to-Zeitzone API oben angegebenen Zipgenius, die die Daten verwendet, die durch @chriv vorgesehen genannt. Fühlen Sie sich frei, es für Ihre eigenen Bedürfnisse zu verwenden.