US ZIP CODE in kaart brengen naar tijdzone

Wanneer gebruikers zich registreren bij onze app, kunnen we hun postcode afleiden wanneer we ze valideren tegen een nationale database. Wat zou de beste manier zijn om een ​​goede potentiële gok van hun tijdzone te bepalen van deze postcode?

We proberen de hoeveelheid gegevens die we expliciet te minimaliseren te minimaliseren. Ze zullen de tijdzone later handmatig kunnen instellen als onze beste schatting verkeerd is. Ik besef postcodes niet bij het uitzoeken van de tijdzone buiten de VS, maar in dat geval zouden we toch handmatig moeten vragen, en we behandelen overwegend met de VS, ongeacht.

Ik heb veel zipcode-databases gevonden, en tot nu toe slechts een paar informatie bevatten tijdzone-informatie, maar die zijn niet gratis, zoals Deze . Als het absoluut noodzakelijk is om een ​​abonnement op een dienst te betalen om dit te doen, dan is het niet de moeite waard en we moeten gewoon de gebruikers expliciet vragen.

Hoewel taal niet bijzonder relevant is, omdat ik waarschijnlijk dingen kan converteren, gebruiken we PHP en MySQL.


1, Autoriteit 100%

Ik heb net een gratis zip-database gevonden inclusief tijdsverschuiving en deelname aan DST. Ik vind het antwoord van Erik J leuk, want het zou me helpen de werkelijke tijdzone te kiezen in tegenstelling tot alleen de offset (omdat je nooit helemaal zeker kunt zijn op de regels), maar ik denk dat ik hiermee kan beginnen, en dat ik het kan beginnen Vind de beste tijdzone-match op basis van offset / DST-configuratie. Ik denk dat ik kan proberen een eenvoudige versie van ontwikkeling 4.0’s antwoord op te zetten om te controleren op wat ik van de ZIP-info krijg als een sanity-test. Het is absoluut niet zo eenvoudig als ik hoop, maar een combinatie zou me ten minste 90% zeker moeten krijgen van de tijdzone van een gebruiker.


Antwoord 2, autoriteit 78%

De meeste staten bevinden zich in precies één tijdzone (hoewel er enkele uitzonderingen zijn). De meeste postcodes overschrijden de staatsgrenzen niet (hoewel er een paar uitzonderingen zijn).

Je zou snel je eigen lijst met tijdzones per zip kunnen maken door die feiten te combineren.

Hier is een lijst met postcodebereiken per staaten een lijst met staten per tijdzone.

Je kunt de grenzen van postcodes zien en vergelijken met de tijdzonekaart met behulp van deze link, of Google Earth, om zips toe te wijzen aan tijdzones voor de staten die zijn opgedeeld door een tijdzonelijn.

De meeste niet-Amerikaanse landen waarmee u te maken hebt, bevinden zich waarschijnlijk in precies één tijdzone (nogmaals, er zijn uitzonderingen). Afhankelijk van uw behoeften, wilt u misschien kijken waar uw top-N niet-Amerikaanse bezoekers vandaan komen en gewoon hun tijdzone opzoeken.


Antwoord 3, autoriteit 33%

Ik heb een Open-Source (MIT-licentie) MySQL-databasetabel gemaakt die naar postcodes en tijdzones verwijst en deze naar sourceforge.net geüpload:

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

Het is afkomstig van vier locaties (primaire Yahoo PlaceFinder API – bedankt @Chris N)

Zie het README-bestand voor meer informatie en instructies.


Antwoord 4, autoriteit 25%

Als je wilt, kun je ook een idee krijgen van de tijdzone door de browser te vragen
Josh Fraser heeft een leuk artikel geschreven erover hier

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

Het tweede dat u moet weten, is of de locatie rekening houdt met zomertijd (DST) of niet. Aangezien de zomertijd altijd in de zomer valt, kunnen we de tijdsverschuiving tussen twee datums in januari vergelijken met de tijdsverschuiving tussen twee datums in juni. Als de offsets anders zijn, weten we dat de locatie DST in acht neemt. Als de offsets hetzelfde zijn, weten we dat de locatie GEEN DST in acht neemt.

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 eer hiervoor gaat naar Josh Fraser.

Dit kan u helpen bij klanten buiten de VS, en het kan een aanvulling zijn
jouw zip-aanpak.

Hier is een SO-vraag die betrekking heeft op het verkrijgen van de tijdzone van javascript


5, Autoriteit 11%

Ruby Gem om postcode om te zetten naar TimeZone: https://github.com/katlean/tzip (gevorkt van https://github.com/farski/tzip ).

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

Het is snel, klein en heeft geen externe afhankelijkheden, maar houd er rekening mee dat postcodes gewoon niet perfect in kaart brengen in de tijdzonen.


6, Autoriteit 3%

Ik heb aan dit probleem gewerkt voor mijn eigen site en heb het gevoel dat ik een mooie goede oplossing heb bedacht

1) Wijs tijdzones toe aan alle staten met slechts één tijdzone (de meeste staten)

en dan een van beide

2a) gebruik de js-oplossing (Javascript/PHP en tijdzones) voor de overige statussen

of

2b) gebruik een database zoals hierboven gelinkt door @Doug.

Op deze manier kunt u tz goedkoop (en zeer nauwkeurig!) vinden voor de meerderheid van uw gebruikers en vervolgens een van de andere, duurdere methoden gebruiken om het voor de rest van de staten te krijgen.

Niet super elegant, maar leek me beter dan het gebruik van js of een database voor elke gebruiker.


Antwoord 7, autoriteit 3%

In aanvulling op het antwoord van Doug Kavendek. Men zou de volgende benadering kunnen gebruiken om dichter bij tz_database te komen.

  1. Download [Gratis database voor breedte- en lengtegraad met postcode]
  2. Download [Een shapefile van de TZ-tijdzones van de wereld]
  3. Gebruik een gratis bibliotheek voor het opvragen van shapefiles (bijv. .NET Easy GIS .NET, LGPL) .
var shapeFile = nieuw ShapeFile(shapeFilePath);
  var shapeIndex = shapeFile.GetShapeIndexContainingPoint(new PointD(long, lat), 0D);
  var attrValues = shapeFile.GetAttributeFieldValues(shapeIndex);
  var timeZoneId = attrValues[0];

P.S. Kan niet alle links invoegen 🙁 Gebruik dus de zoekfunctie.


Antwoord 8, autoriteit 3%

Hiermee wordt een yaml-bestand gedownload dat alle tijdzones toewijst aan een reeks van hun postcodes:

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

bijv.

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

Als u de voorkeur geeft aan de verkorte timezones, kunt u deze uitvoeren:

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

b.g

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

9

Noteer ook, dat als u toevallig de YAHOO GEOCODING-SERVICE gebruikt, u tijdzone-informatie hebt geretourneerd door de juiste vlag in te stellen.

http://developer.yahoo.com/geo/ PlaceFinder / Gids / Request.html # vlaggen-parameter


10

Hier is eigenlijk een geweldige Google API voor. Het neemt een locatie in en retourneert de tijdzone voor die locatie. Zou eenvoudig genoeg moeten zijn om een bash- of python-script te maken om de resultaten voor elk adres in een CSV-bestand of database te krijgen en vervolgens de tijdzone-informatie op te slaan.

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

Eindpunt aanvragen:

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

Reactie:

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

Other episodes