Налаштування поштового індексу США в часовий пояс [закрито]


84

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

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

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

Хоча мова не особливо актуальна, оскільки я, напевно, можу перетворити речі, наскільки це потрібно, ми використовуємо PHP та MySQL.


2
+1 за запитання про вгадування
Кріс МакКолл,

Відповіді:


37

Я щойно знайшов безкоштовну базу даних zip, яка включає зсув часу та участь у літньому та зимовому часу. Мені подобається відповідь Еріка Дж., Оскільки це допомогло б мені вибрати фактичний часовий пояс на відміну від простого зсуву (бо ви ніколи не можете бути повністю впевнені в правилах), але я думаю, що я міг би почати з цього і спробувати знайти найкращий збіг часового поясу на основі конфігурації зсуву / часу. Я думаю, що я можу спробувати створити просту версію відповіді на розробку 4.0, щоб перевірити те, що я отримую від zip-інформації, як перевірку розумності. Це точно не все так просто, як я сподіваюся, але комбінація повинна переконати мене як мінімум на 90% у часовому поясі користувача.


@Doug: Все, що стосується геокодування, ніколи не буде на 100% правильним, тим більше, коли ви дієте лише на рівні ZIP. І все-таки, якщо ви можете бути правильними 90% + випадків часу, це, мабуть, буде корисно для ваших користувачів. Найгірше, що ви, ймовірно, не вийдете - це одна година.
Eric J.

3
стережіться, безкоштовні бази даних zip майже завжди застарілі, оскільки поштова служба щомісяця змінює цей файл. також див. semaphorecorp.com/cgi/zip5.html
Джо Снайдер,

Це посилання підказує кілька хороших моментів, але оскільки я просто використовую це, щоб здогадатися про загальний регіон (і дозволяючи виправлення), мені не слід занадто турбуватися. Якщо поштовий індекс не може перекинути кілька часових поясів - але в цьому випадку це вже крайній випадок, і оскільки ми ніколи не будемо запитувати адреси користувачів, ми не зможемо використовувати їх для подальшої перевірки. Але справді, нам, мабуть, було б корисно насправді підписатись на нього перед тим, як щось вийде в ефір, щоб бути в курсі подій. Безкоштовний принаймні хороший для тестування.
Doug Kavendek

2
@joesnyder Посилання порушено, чи не могли б ви оновити або хоча б пояснити, що там було?
dlsso


26

Більшість штатів знаходяться рівно в одному часовому поясі (хоча є кілька винятків). Більшість поштових індексів не перетинають державних кордонів (хоча є кілька винятків).

Ви можете швидко скласти свій власний список часових поясів на zip, поєднавши ці факти.

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

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

Більшість країн, які не мають відношення до США, мабуть, перебувають рівно в одному часовому поясі (знову ж таки, є винятки). Залежно від ваших потреб, ви можете поглянути на те, звідки походять ваші найпопулярніші відвідувачі, які не є американцями, і просто переглянути їх часовий пояс.


1
Ого, які винятки?
Hamish Grubijan

5
@Hamish: Винятки для штатів у кількох часових поясах, які ви можете побачити за посиланням у Вікіпедії (штати за часовим поясом). Мій колега наводить на карту ZIP-коди штатів, коли ми говоримо, і натрапив на кілька ZIP-файлів, які перетинають лінії штатів. Одним із прикладів є 42223.
Ерік Дж.,

2
Також зауважте, що деякі штати (я вважаю лише Арізону та Гаваї ) не дотримуються переходу на літній час.
Джон-Ерік,

1
Штати на північному заході США мають мільйон і один поштовий індекс на штат; справедливе попередження.
Qix - МОНІКУ ПОМИЛИЛО

1
Це набагато більше, ніж кілька винятків. timetemperature.com/tzus/indiana_time_zone.shtml
Кріс

12

Я створив таблицю бази даних MySQL з відкритим кодом (з ліцензією MIT), в якій перехресні посилання на поштові індекси та часові пояси, і завантажив її на sourceforge.net:

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

Він постачається з чотирьох місць (основний API Yahoo PlaceFinder - спасибі @Chris N)

Дивіться файл README для отримання додаткової інформації та інструкцій.


Будь-який шанс у вас все ще є код, який це створив? Зараз йому кілька років, і я сподіваюся отримати новий набір даних.
Біллі

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
}

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

Це може допомогти вам із замовниками за межами США, а також може доповнити ваш підхід до поштового індексу.

Ось такі запитання, що стосуються отримання часового поясу з JavaScript


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 , я можу потім використовувати це для локалізації будь-якого конкретного часу та часу у власному коді.

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


4
Зауважте, що для ліцензування API геокодування Google потрібно використовувати результати для відображення на карті ...
Джош,

@Josh Ви хочете сказати, що я не можу використовувати API геокодування для захоплення місця для цілей визначення часового поясу в цьому місці?
Кранчер

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.

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

Не надто елегантний, але мені здався кращим, ніж використання js або бази даних для кожного користувача.


1

На додаток до відповіді Дуга Кавендека. Можна наблизити такий підхід, щоб наблизитися до бази даних tz_data.

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

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 була EOL'd кілька років тому.
lreeder

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

слід зазначити, що api становить 5 доларів за 1 тис дзвінків.
FlyingZebra1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.