Pregunta

Cuando los usuarios se registren con nuestra aplicación, podemos inferir su código postal cuando las validar contra una base de datos nacional. ¿Cuál sería la mejor manera de determinar una buena conjetura potencial de su zona horaria en el código postal?

Estamos tratando de minimizar la cantidad de datos que explícitamente tenemos que pedirles. Ellos serán capaces de ajustar manualmente la zona horaria más tarde si nuestra mejor suposición es incorrecta. Soy consciente de los códigos postales no ayudarán con averiguar la zona horaria fuera de los EE.UU., pero en ese caso tendríamos que pedir manualmente todos modos, y que se ocupará de preferencia con los EE.UU., independientemente.

He encontrado una gran cantidad de bases de datos de código postal, y hasta ahora sólo un pocos contienen información de zona horaria, pero los que lo hacen no son libres, como éste . Si es absolutamente necesario pagar una suscripción a un servicio con el fin de hacer esto, entonces no valdrá la pena y que sólo tendrá que pedir a los usuarios de forma explícita.

A pesar de que el lenguaje no es particularmente relevante ya que es probable que pueda convertir las cosas sin embargo necesitó, nosotros estamos usando PHP y MySQL.

¿Fue útil?

Solución

Acabo de encontrar una libre base de datos zip que incluye compensación de tiempo y la participación en el horario de verano. Me gusta la respuesta de Erik J, ya que ayudaría a elegir la zona horaria real en lugar de sólo el desplazamiento (porque nunca se puede estar completamente seguro en las reglas), pero creo que podría empezar con esto, y tienen que tratar de encontrar el mejor partido zona horaria en función de la configuración / DST offset. Creo que puede tratar de establecer una versión simple de la respuesta de Desarrollo 4.0 para comprobar en contra de lo que recibo de la información postal como una prueba de cordura. Definitivamente no es tan simple como yo espero, pero una combinación me debe obtener al menos el 90% seguro de la zona horaria de un usuario.

Otros consejos

La mayoría de los estados están en exactamente una zona de tiempo (aunque hay algunas excepciones). La mayoría de los códigos postales no cruzan las fronteras estatales (aunque hay algunas excepciones).

Se puede rápidamente llegar con su propia lista de zonas horarias por postal mediante la combinación de esos hechos.

He aquí una lista de varía por estado , y una lista de estados por zona horaria .

Puede ver los límites de códigos postales y comparar con el mapa de zona horaria usando aquí o Google Earth, para mapear las cremalleras a husos horarios de los estados que se dividen por una línea de huso horario.

La mayoría de los países fuera de Estados Unidos que está tratando son probablemente exactamente en una zona horaria. Es posible que desee ver en donde su top-N no estadounidense visitantes provienen de las operaciones de búsqueda y simplemente su zona horaria.

He creado 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/

Se obtiene de cuatro lugares (API primaria Yahoo Buscar poblaciones - gracias @ Chris N)

Vea el archivo Léame para obtener más información e instrucciones.

Si lo desea, también puede tener una idea de la zona horaria pidiendo al navegador Josh Fraser tiene una buena escritura hasta en él aquí

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. Dado que el horario de verano siempre se observa durante el verano, podemos comparar el desplazamiento entre dos fechas en enero de tiempo, para el desplazamiento entre dos fechas en junio de tiempo. Si los desplazamientos son diferentes, entonces sabemos que el lugar se observa el horario de verano. Si las compensaciones 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 para esto va a Josh Fraser.

Esto le podría ayudar con los clientes fuera de los EE.UU., y podría complementar su acercamiento postal.

Aquí es lo que se pregunta que tocan en conseguir la zona horaria de JavaScript

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×tamp=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 regresó parece que timeZoneName tiene en cuenta el ahorro de luz del día, en base a la marca de tiempo, mientras que timeZoneId es un nombre DST-independiente de la zona horaria.

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

Creo que para PHP de manera similar se puede encontrar "América / New_York" en http: //pecl.php. net / paquete / timezonedb

Rubí joya para convertir el código postal de zona horaria: https://github.com/Katlean/TZip (en forma de horquilla 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.

hizo un hash Rubí de todos los códigos postales en los EE.UU. y sus zonas horarias asociadas que se puede utilizar si está interesado. Debe ser bastante fácil de realizar ingeniería inversa para sus propósitos.

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

y luego o bien

2a) utilizan la solución js ( Javascript / PHP y zonas horarias ) para los estados restantes

o

2b) utiliza una base de datos como la que vinculado anteriormente por @Doug.

De esta manera, se pueden encontrar tz barata (y altamente precisa!) Para la mayoría de sus usuarios y utilice uno de los otros métodos más costosos para conseguir que para el resto de los estados.

No es super elegante, pero parecía mejor para mí que el uso de JS o una base de datos para cada usuario.

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

  1. Descargar [Free Zip Código Latitud y longitud de base de datos]
  2. Descargar [Un archivo de forma de las zonas horarias del mundo TZ]
  3. Utilice cualquier biblioteca de consulta libre para archivo de formas (por ejemplo, .NET Fácil SIG .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.

Vea estos enlaces para la base de datos Olson:

I mantener un API-código postal-a zona horaria llamado ZipGenius que utiliza los datos proporcionados por @chriv proporcionada anteriormente . Siéntase libre de usarlo para sus propias necesidades.

Tenga en cuenta también, que si le toca estar utilizando el servicio de geocodificación Yahoo que puede tener información de zona horaria devuelta al configurar la indicación correcta.

http://developer.yahoo.com/geo/ Buscar poblaciones / guía / requests.html # banderas parámetros

Esto descargará un archivo YAML que trazará un mapa de 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, puede ejecutar la siguiente:

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

por ejemplo.

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

De hecho, hay una gran API de Google para esto. Se necesita en un lugar y devuelve la zona horaria para esa ubicación. Debe ser lo suficientemente simple para crear un script bash o pitón para obtener los resultados para cada dirección en un archivo CSV o base de datos a continuación, guardar la información de 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"
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top