Подтвердить что ты не робот

Сопоставление почтового индекса США с часовым поясом

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Здесь приведен список диапазонов почтовых индексов для каждого состояния и список указывает на часовой пояс.

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

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

Ответ 3

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

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

Это источник из четырех мест (первичный Yahoo PlaceFinder API - благодаря @Chris N)

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

Ответ 4

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

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

Ответ 5

В 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 аналогичным образом вы можете найти "Америка/Новый_York" в http://pecl.php.net/package/timezonedb

Ответ 6

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

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

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

Ответ 9

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

1) Назначение часовых поясов для всех состояний с одним часовым поясом (большинство состояний)

а затем либо

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

или

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

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

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

Ответ 10

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

  • Загрузить [Свободная база данных широты и долготы]
  • Загрузить [шейп файл тайм-зон TZ мира]
  • Используйте любую бесплатную библиотеку для запроса формы файла (например, .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. Невозможно вставить все ссылки:( Поэтому, пожалуйста, используйте поиск.

Ответ 11

Это загрузит файл yaml, который будет отображать все временные интервалы в массив их zip-кодов:

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...

Ответ 12

На самом деле для этого отличный API Google. Он занимает место и возвращает часовой пояс для этого местоположения. Должно быть достаточно простым, чтобы создать bash или python script, чтобы получить результаты для каждого адреса в файле 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"
}

Ответ 14

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

Ответ 15

Я знаю, что опаздываю на вечеринку - но для будущих путешественников, таких как я, World Weather Online имеет лучший API времени/местоположения, который я когда-либо видел. Просто, как шарики, именно то, что вы ожидаете, гибкий и точный...

https://www.worldweatheronline.com/developer/api/docs/time-zone-api.aspx