Отображение почтового индекса США в часовой пояс - PullRequest
78 голосов
/ 16 марта 2010

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

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

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

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

Ответы [ 14 ]

37 голосов
/ 16 марта 2010

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

24 голосов
/ 16 марта 2010

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

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

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

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

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

11 голосов
/ 24 апреля 2012

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

.

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

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

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

8 голосов
/ 16 марта 2010

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

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.Если смещения одинаковы, то мы знаем, что место не соблюдает летнее время.

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
}

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

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

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

4 голосов
/ 01 сентября 2014

У 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

4 голосов
/ 16 мая 2012

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

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

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

2 голосов
/ 29 октября 2014

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

1 голос
/ 13 декабря 2017

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

1 голос
/ 26 сентября 2014

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

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

1 голос
/ 05 июля 2011

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

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

, а затем либо

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

или

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

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

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

...