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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

а затем либо

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

или

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

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

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

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

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

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

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

PS Невозможно вставить все ссылки 🙁 Поэтому, пожалуйста, используйте поиск.

Для этого есть отличный 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" } 

Это загрузит файл 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... 

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

  • Веб-сервис - текущий часовой пояс для города?
  • Получение системных часовых поясов на разных языках
  • Как перевести между часовыми поясами Windows и IANA?
  • Как справиться с летней экономией, используя TimeZone в Java
  • Могу ли я получить часовой пояс браузера в ASP.NET или мне нужно полагаться на операции JS для извлечения информации?
  • Временные зоны MySQL
  • Мне нужен список сопоставлений городов для timezones - лучший способ получить его?
  • Названия часовых поясов с одинаковыми свойствами дают разные результаты при применении к метке времени
  • Как использовать пользовательское время в браузере для проверки разницы во времени между клиентом и сервером
  • Как использовать TimeZoneInfo для получения местного времени во время летнего времени?
  • .NET DateTime.Now возвращает неправильное время, когда изменяется часовой пояс
  • Interesting Posts

    Проблема с DexIndexOverflowException после обновления до последней библиотеки приложений и поддержки

    Почему общий доступ к файлам и принтерам отключается в Windows 7?

    Как обновить virtualbox 4.2 до 4.3 на debian wheezy с apt-get?

    Qt Creator – Project ERROR: Xcode настроен неправильно. Возможно, вам потребуется подтвердить лицензионное соглашение, запустив / usr / bin / xcodebuild

    Поддержка NTFS для чтения / записи Mac OS X

    Как выбрать различные значения полей с помощью Solr?

    Если вы подключаетесь непосредственно к модему, как назначается IP-адрес?

    Как выполнить XPath one-liners из оболочки?

    Внедрение переменной javascript перед скриптом содержимого

    64-разрядная Dell застряла на экране входа / заставки

    Список свойств интерфейса Java Swing?

    Есть ли способ контролировать состояние SSD и предсказать его сбой в случае активного использования чтения-записи?

    Замена событий мутации DOM

    Зачем выбирать статический class по сравнению с одноэлементной реализацией?

    Spark UDAF с параметром ArrayType в качестве проблем с производительностью bufferSchema

    Давайте будем гением компьютера.