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

84

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

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

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

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

Дуг Кавендек
источник
2
+1 за вопрос о предположениях
Крис Макколл

Ответы:

37

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

Дуг Кавендек
источник
@Doug: Все, что связано с геокодированием, никогда не будет на 100% правильным, тем более, что вы действуете только на уровне ZIP. Тем не менее, если вы можете быть правы в 90% + случаев, это, вероятно, принесет пользу вашим пользователям. Худшее, что вы можете пропустить, - это час.
Эрик Дж.
3
будьте осторожны, бесплатные zip-базы данных почти всегда устаревают, поскольку почтовая служба меняет этот файл ежемесячно. также см. semaphorecorp.com/cgi/zip5.html
joe snyder
Эта ссылка поднимает несколько хороших моментов, но, поскольку я использую ее только для того, чтобы сделать предположение об общей области (и с учетом исправлений), мне не стоит особо беспокоиться. Если только почтовый индекс не может охватывать несколько часовых поясов, но в этом случае это уже крайний случай, и поскольку мы никогда не будем запрашивать адреса пользователей, мы не сможем использовать их для дальнейшей проверки. Но на самом деле, для нас, вероятно, было бы полезно подписаться на один до того, как все будет запущено, чтобы быть в курсе. Бесплатная как минимум годится для тестирования.
Дуг Кавендек
2
@joesnyder Ссылка не работает, не могли бы вы обновить или хотя бы объяснить, что там было?
dlsso
2
@dlsso, эта ссылка теперь называется Почему все 5-значные списки почтовых индексов
Джо Снайдер
26

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

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

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

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

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

Эрик Дж.
источник
1
Вау, а какие бывают исключения?
Хэмиш Грубиджан,
5
@Hamish: исключения для состояний в нескольких часовых поясах, которые вы можете увидеть в ссылке в Википедии (состояния для каждого часового пояса). Мой коллега сопоставляет ZIP-файлы со штатами, пока мы говорим, и наткнулся на несколько ZIP-файлов, которые пересекают границы штатов. Один из примеров - 42223.
Эрик Дж.
2
Также обратите внимание, что в некоторых штатах ( думаю, только в Аризоне и Гавайях ) не соблюдается переход на летнее время.
Джон-Эрик,
1
В штатах на северо-западе США есть миллион и один почтовый индекс на штат; справедливое предупреждение.
Qix - МОНИКА БЫЛА ОФИЦИАЛЬНЫМ ОБРАЗОМ
1
Это намного больше, чем несколько исключений. timetempera.com/tzus/indiana_time_zone.shtml
Крис Москини
12

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

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

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

См. Файл README для получения дополнительной информации и инструкций.

Chriv
источник
Есть ли шанс, что у вас все еще есть код, который его сгенерировал? Ему уже несколько лет, и я надеюсь получить свежий набор данных.
Билли
8

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

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) или нет. Поскольку летнее время всегда наблюдается летом, мы можем сравнить смещение по времени между двумя датами в январе со смещением по времени между двумя датами в июне. Если смещения разные, то мы знаем, что в этом месте соблюдается летнее время. Если смещения такие же, то мы знаем, что в этом месте НЕ соблюдается летнее время.

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
}

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

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

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

Развитие 4.0
источник
1
благодаря! Как Джош упоминает на своем сайте, Джон Ниландер «написал более надежное решение. Используйте вместо этого его версию». Его версия здесь: bitbucket.org/pellepim/jstimezonedetect
Брэд Паркс,
6

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

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

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

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

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

Анэнтропический
источник
4
Обратите внимание, что лицензирование API геокодирования Google требует, чтобы вы использовали результаты для отображения на карте ...
Джош
@Josh Вы хотите сказать, что я не могу использовать API геокодирования, чтобы получить местоположение для определения часового пояса в этом месте?
Cruncher
2
На странице политики: «Вы можете отображать результаты API часовых поясов на карте Google или без карты. Если вы хотите отображать результаты API часовых поясов на карте, эти результаты должны отображаться на карте Google. Это запрещено. использовать данные API часовых поясов на карте, не являющейся картой Google ". developers.google.com/maps/documentation/timezone/policies
tmorell
4

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

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

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

Мкирк
источник
1
И оригинальный TZip, и вилка Katlean хороши, но не на 100% точны. Некоторые почтовые индексы (вероятно, введенные в последние несколько лет) не учитываются.
bigtex777
1

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

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

а потом либо

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

или же

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

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

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

Мэтт Паррилла
источник
1

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

  1. Загрузить [Бесплатная база данных широты и долготы почтового индекса]
  2. Скачать [шейп-файл с часовыми поясами TZ мира]
  3. Используйте любую бесплатную библиотеку для запросов к шейп-файлам (например, .NET Easy GIS .NET , LGPL).
    var shapeFile = новый файл формы (shapeFilePath);
    var shapeIndex = shapeFile.GetShapeIndexContainPoint (новая точкаD (длинная, широта), 0D);
    var attrValues ​​= shapeFile.GetAttributeFieldValues ​​(shapeIndex);
    var timeZoneId = attrValues ​​[0];

PS Не могу вставить все ссылки :( Так что воспользуйтесь поиском.

Дмитрий Зубрилин
источник
1

Это загрузит файл yaml, который сопоставит все часовые пояса с массивом их почтовых индексов:

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...
БананНил
источник
1
Это включает 96941 (Микронезия) как время по тихоокеанскому времени и включает 83500 как почтовый индекс по тихоокеанскому времени, но я не верю, что он существует в Соединенных Штатах. Как были созданы данные?
Джастин Бланк
0

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

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

Крис Н
источник
Возможно, когда-то это было полезно, но отличная служба геокодирования Yahoo была закрыта несколько лет назад.
lreeder 04
0

Для этого есть отличный API Google. Он принимает местоположение и возвращает часовой пояс для этого местоположения. Должно быть достаточно просто, чтобы создать сценарий 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"
}
Анонимно
источник
Следует отметить, что api составляет 5 долларов за 1к звонков.
FlyingZebra1