Отображение почтового индекса США в часовой пояс



когда пользователи регистрируются в нашем приложении, мы можем определить их почтовый индекс, когда мы проверяем их в национальной базе данных. Каков был бы лучший способ определить хорошее потенциальное предположение о своем часовом поясе из этого почтового индекса?



мы пытаемся свести к минимуму количество данных, которые мы явно должны просить их. Они смогут вручную установить часовой пояс позже, если наше лучшее предположение неверно. Я понимаю, что почтовые индексы не помогут с выяснением часового пояса за пределами США, но в этом случае нам все равно придется вручную спрашивать, и мы имеем дело преимущественно с США независимо.



Я нашел много баз данных почтовых индексов, и до сих пор только некоторые из них содержат информацию о часовом поясе, но те, которые не являются бесплатными, например этот. Если для этого абсолютно необходимо оплатить подписку на услугу, то это не будет стоить того, и нам просто нужно будет спросить пользователей явно.



хотя язык не особо релевантно, поскольку я, вероятно, могу конвертировать вещи, однако необходимые, мы используем PHP и MySQL.

921   14  

14 ответов:

Я только что нашел free zip database Это включает в себя смещение времени и участие в DST. Мне нравится ответ Erik J, так как это поможет мне выбрать фактический часовой пояс, а не только смещение (потому что вы никогда не можете быть полностью уверены в правилах), но я думаю, что могу начать с этого и попытаться найти лучшее совпадение часового пояса на основе конфигурации offset/dst. Я думаю, что я могу попытаться настроить простую версию ответа на разработку 4.0, чтобы проверить, что я получаю из zip-информации в качестве теста на здравомыслие. Это определенно не так просто, как я надеюсь, но комбинация должна дать мне по крайней мере 90% уверенности в часовом поясе пользователя.

большинство государств в одном часовом поясе (хотя есть несколько исключений). Большинство почтовых индексов не пересекают государственные границы (хотя есть несколько исключений).

вы можете быстро придумать свой собственный список часовых поясов на zip, объединив эти факты.

вот список диапазоны почтовых индексов для каждого штата и список состояния в часовом поясе.

вы можете увидеть границы почтовых индексов и сравнить с картой часового пояса используя этой ссылке, или Google Earth, чтобы отобразить молнии в часовых поясах для состояний, которые разделены линией часового пояса.

большинство неамериканских стран, с которыми вы имеете дело, вероятно, находятся ровно в одном часовом поясе. Вы можете посмотреть, откуда приходят ваши топ-N неамериканские посетители, и просто найти их часовой пояс.

Я создал таблицу базы данных MySQL с открытым исходным кодом (MIT licensed), которая перекрестно ссылается на почтовые индексы и часовые пояса и загружает ее sourceforge.net:

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

Он поступает из четырех мест (основной Yahoo PlaceFinder API-спасибо @Chris N)

дополнительную информацию и инструкции см. В файле README.

Если вы хотите, вы также можете получить представление о часовом поясе, спросив браузер Джош Фрейзер имеет хорошая запись на нем здесь

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

второе, что вам нужно знать, является ли расположение соблюдает летнее время (DST) или нет. Поскольку DST всегда наблюдается летом, мы можем сравнить смещение времени между двумя датами в январе и смещение времени между двумя датами в июне. Если смещения разные, то мы знаем, что расположение отмечает переход на летнее время. Если смещения одинаковы, то мы знаем, что местоположение не соблюдает DST.

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
}

вся заслуга в этом принадлежит Джошу Фрейзеру.

Это может помочь вам с клиентами за пределами США, и это может дополнить ваш почтовый подход.

вот так вопросы, которые касаются получения часового пояса из javascript

у Google есть специальный API для этого: https://developers.google.com/maps/documentation/timezone/

например: 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"
}

они требуют метки времени unix на строке запроса. Из возвращенного ответа следует, что timeZoneName учитывает переход на летнее время, на основе меток времени, в то время как timeZoneId является DST-независимым именем для часовой пояс.

для моего использования, в Python, я просто передаю timestamp=0 и с помощью timeZoneId значение tz_info объект pytz, Я могу использовать это, чтобы локализовать любую конкретную дату и время в моем собственном коде.

Я считаю, что для PHP аналогично вы можете найти "America / New_York" в http://pecl.php.net/package/timezonedb

Ruby gem для преобразования почтового индекса в часовой пояс:https://github.com/Katlean/TZip (раздвоенный от https://github.com/farski/TZip).

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

он быстрый, маленький и не имеет внешних зависимостей, но имейте в виду, что почтовые индексы просто не идеально соответствуют часовым поясам.

недавно сделал рубиновый хэш всех zipcodes в США и связанных с ними часовых поясов что вы могли бы использовать, если вы заинтересованы. Должно быть довольно легко перепроектировать для ваших целей.

Я работаю над этой проблемой для моего собственного сайта и чувствую, что я придумал довольно хорошее решение

1) назначить часовые пояса для всех государств только с одним часовым поясом (большинство государств)

и затем

2a) используйте решение js (Javascript / PHP и часовые пояса) для остальных государств

или

2b) используйте базу данных, как тот, который связан выше @Doug.

таким образом, вы можете найти TZ дешево (и очень точно!) для большинства ваших пользователей, а затем использовать один из других, более дорогих методов, чтобы получить его для остальных государств.

не очень элегантный, но мне показалось лучше, чем использовать js или базу данных для каждого пользователя.

Также обратите внимание, что если вы используете службу геокодирования Yahoo, вы можете вернуть информацию о часовом поясе, установив правильный флаг.

http://developer.yahoo.com/geo/placefinder/guide/requests.html#flags-parameter

в дополнение к ответу Дуга Кавендека. Можно использовать следующий подход, чтобы приблизиться к tz_database.

  1. скачать [бесплатный почтовый индекс широта и долгота базы данных]
  2. скачать [шейп-файл часовых поясов TZ мира]
  3. использовать любую бесплатную библиотеку для шейп-файла запрос (например,.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];

П. С. Не могу вставить все ссылки :( поэтому, пожалуйста, используйте поиск.

там на самом деле большой Google API для этого. Он принимает местоположение и возвращает часовой пояс для этого местоположения. Должно быть достаточно просто создать сценарий bash или python, чтобы получить результаты для каждого адреса в файле CSV или базе данных, а затем сохранить информацию о часовом поясе.

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

Запрос Конечная Точка:

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

ответ:

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

это загрузит файл yaml, который будет отображать все часовые пояса в массив их zipcodes:

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

например

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

если вы предпочитаете укороченные часовые пояса, вы можете запустить этот:

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

например

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

Я поддерживаю API zipcode-to-timezone под названием Zipgenius который использует данные, предоставленные @chriv, приведенные выше. Не стесняйтесь использовать его для собственных нужд.

Comments

    Ничего не найдено.