2010-03-16 7 views
71

Cuando los usuarios se registran en nuestra aplicación, podemos deducir su código postal cuando los validamos en una base de datos nacional. ¿Cuál sería la mejor manera de determinar una buena conjetura potencial de su zona horaria a partir de este código postal?Asignación del código postal de EE. UU. A la zona horaria

Estamos tratando de minimizar la cantidad de datos que explícitamente tenemos que pedirles. Podrán establecer manualmente el huso horario más tarde si nuestra mejor estimación es incorrecta. Me doy cuenta de que los códigos postales no ayudarán a determinar la zona horaria fuera de los EE. UU., Pero en ese caso tendríamos que preguntar de todos modos de todos modos, y nos ocupamos principalmente de los EE. UU. Independientemente.

He encontrado una gran cantidad de bases de datos de código postal, y hasta ahora solo algunas contienen información de zona horaria, pero las que no son libres, como this one. Si es absolutamente necesario abonar una suscripción a un servicio para hacerlo, no valdrá la pena y tendremos que preguntar a los usuarios de forma explícita.

Aunque el lenguaje no es particularmente relevante ya que probablemente pueda convertir cosas de la forma que sea necesaria, estamos usando PHP y MySQL.

+2

+1 por cuestión de adivinar –

Respuesta

31

Acabo de encontrar una free zip database que incluye compensación de tiempo y la participación en el horario de verano. Me gusta la respuesta de Erik J, ya que me ayudaría a elegir la zona horaria real en lugar de solo la compensación (porque nunca se puede estar completamente seguro de las reglas), pero creo que podría comenzar con esto y hacer que intente encuentre la mejor coincidencia de zona horaria basada en la configuración offset/dst. Creo que puedo intentar configurar una versión simple de Desarrollo 4.La respuesta de 0 para verificar contra lo que obtengo de la información del archivo zip como una prueba de cordura. Definitivamente no es tan simple como esperaba, pero una combinación debería hacerme al menos un 90% seguro de la zona horaria de un usuario.

+0

@Doug: cualquier cosa que se relacione con GeoCoding nunca será 100% correcta, más aún cuando solo está actuando en el nivel ZIP. Aún así, si puede estar correcto el 90% + del tiempo, probablemente sea un beneficio para sus usuarios. Lo peor es que probablemente te vayas fuera una hora. –

+3

ten cuidado, las bases de datos zip gratuitas casi siempre son obsoletas, ya que el servicio postal cambia ese archivo mensualmente. también vea http://semaphorecorp.com/cgi/zip5.html –

+0

Ese enlace presenta algunos puntos buenos, pero como solo estoy usando esto para adivinar la región en general (y permitir las correcciones), no debería Tengo que preocuparme demasiado. A menos que un código postal pueda abarcar múltiples zonas horarias, pero en ese caso, ya es un caso extremo, y dado que nunca pediremos las direcciones de los usuarios, no podríamos usarlas para validarlas aún más. Pero, de hecho, probablemente sería útil para nosotros suscribirnos a uno antes de que las cosas salgan a la luz, para mantenernos actualizados. El libre es al menos bueno para la prueba. –

25

La mayoría de los estados están en exactamente un huso horario (aunque hay algunas excepciones). La mayoría de los códigos postales no cruzan los límites del estado (aunque hay algunas excepciones).

Puede crear rápidamente su propia lista de zonas horarias por archivo postal combinando esos datos.

Aquí hay una lista de zip code ranges per state, y una lista de states per time zone.

Puede ver los límites de los códigos postales y compararlos con el mapa de la zona horaria usando this link, o Google Earth, para asignar cremalleras a las zonas horarias para los estados divididos por una línea de zona horaria.

La mayoría de los países que no son de los EE. UU. Con los que está tratando se encuentran probablemente en un solo huso horario. Es posible que desee ver de dónde provienen los visitantes que provienen de la parte superior N de los EE. UU. Y solo buscar su zona horaria.

+1

Guau, ¿cuáles son las excepciones? –

+4

@Hamish: Excepciones para estados en múltiples zonas horarias que puede ver en el enlace de Wikipedia (estados por zona horaria). Mi colega está mapeando ZIPs a los estados mientras hablamos y se encontró con algunos ZIP que cruzan las líneas de estado. Un ejemplo es 42223. –

+0

Por lo que sé, Montana, ORegon, Idaho, dakotas, nebraska, kansas, texas, y algunos de los estados del Medio Oriente – dassouki

8

Si lo desea, también puede tener una idea de la zona horaria pidiendo al navegador Josh Fraser tiene 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); 

La segunda cosa que usted necesita saber es si el lugar se observa el horario de verano (DST) o no. Como el horario de verano se observa siempre durante el verano, podemos comparar la compensación de tiempo entre dos fechas en enero, con el tiempo compensado entre dos fechas en junio. Si los desplazamientos son diferentes, entonces sabemos que la ubicación observa el horario de verano. Si los desplazamientos son los mismos, entonces sabemos que la ubicación NO observa el horario de verano.

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 
} 

Todo el crédito se debe a Josh Fraser.

Esto podría ayudarlo con clientes fuera de los EE. UU., Y podría complementar su enfoque zip.

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

+0

+1 Servidor sería más agradable, pero me gusta la solución JS :) – Basic

+0

gracias! Como Josh menciona en su sitio, Jon Nylander ha "escrito una solución más sólida. Use su versión". Su versión está aquí: https://bitbucket.org/pellepim/jstimezonedetect –

1

He estado trabajando en este problema para mi propio sitio y siento que he llegado con una solución bastante buena

1) Asignar zonas de tiempo a todos los estados con una sola zona horaria (la mayoría de los estados)

y luego o bien

2a) utilizar la solución js (Javascript/PHP and timezones) para los estados restantes

o

2b) utilizar una base de datos como la enlazada anteriormente por @Doug.

De esta manera, puede encontrarlo a bajo costo (¡y con mucha precisión!) Para la mayoría de sus usuarios y luego utilizar uno de los otros métodos más caros para obtenerlo para el resto de los estados.

No es muy elegante, pero me pareció mejor que usar js o una base de datos para cada usuario.

9

creé un Open-Source (MIT licencia) tabla de base de datos MySQL que las referencias cruzadas códigos postales y zonas horarias y subido a sourceforge.net:

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

suministrador del MI desde cuatro ubicaciones (API principal de Yahoo PlaceFinder - gracias @Chris N)

Consulte el archivo README para obtener más información e instrucciones.

4

Ruby gema para convertir el código postal a la zona horaria: https://github.com/Katlean/TZip (bifurcado de https://github.com/farski/TZip).

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

Es rápido, pequeño y no tiene dependencias externas, pero tenga en cuenta que los códigos postales simplemente no se asignan perfectamente a las zonas horarias.

+1

Tanto la horquilla original de TZip como la de Katlean son buenas, pero no son 100% precisas. Algunos códigos postales (probablemente introducidos en los últimos años) no se tienen en cuenta. – bigtex777

5

Google tiene una API específica para esto: https://developers.google.com/maps/documentation/timezone/

por ejemplo: 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" 
} 

requieren una marca de tiempo Unix en la cadena de consulta. A partir de la respuesta devuelta, parece que timeZoneName tiene en cuenta el horario de verano, en función de la marca de tiempo, mientras que timeZoneId es un nombre independiente de DST para la zona horaria.

para mi uso, en Python, sólo estoy pasando timestamp=0 y utilizando el valor timeZoneId para obtener un objeto tz_info de pytz, puedo entonces utilizar eso para localizar cualquier fecha y hora particular de mi propio código.

creo para PHP mismo modo se puede encontrar "América/New_York" en http://pecl.php.net/package/timezonedb

+4

Tenga en cuenta que la licencia de la API de geocodificación de Google requiere que use los resultados para mostrar en un mapa ... – Josh

1

Además de respuesta Doug Kavendek. Uno podría usar el siguiente enfoque para acercarse a tz_database.

  1. Descargar [Código Postal Latitud libre y base de datos Longitud]
  2. Descargar [Un archivo de forma de las zonas horarias TZ del mundo]
  3. utilizar cualquier librería gratuita para consultas archivo de formas (por ejemplo .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. No se puede insertar todos los enlaces :(Así que por favor, utilice la búsqueda.

0

Esto descargará una yaml archivo que va a asignar todas las zonas horarias a una gran variedad de sus códigos postales:

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

por ejemplo

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

Si prefiere las zonas horarias acortadas, y Puede ejecutar este:

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

p.

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

Esto incluye 96941 (Micronesia) como estar en hora del Pacífico, e incluye 83500 como código postal en hora del Pacífico, pero lo hago No creo que exista en los Estados Unidos. ¿Cómo se creó la información? –

1

En este momento existe una gran API de Google para esto. Toma una ubicación y devuelve la zona horaria de esa ubicación. Debe ser lo suficientemente simple como para crear una secuencia de comandos bash o python para obtener los resultados de cada dirección en un archivo CSV o base de datos luego guarde la información de la zona horaria.

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

Solicitud de punto final:

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

Respuesta:

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

mantengo una API de código postal a la zona horaria llamada Zipgenius que utiliza los datos proporcionados por @chriv proporcionado anteriormente. Siéntase libre de usarlo para sus propias necesidades.

Cuestiones relacionadas