Рубрики
Без рубрики

Как я узнал, что изучаю время в западном советском союзе

Здесь, в Nylas, мы строим API, чтобы помочь разработчикам создать приложения поверх … Tagged с календарапи, Python, API, Pytz.

Здесь, в Nylas , мы строим API, чтобы помочь Разработчики создают приложения Вдобавок к электронной почте, календарь и контакты. Оказывается, это многому научит вас об изменениях времени в Западном Советском Союзе. Я присоединился к Nylas всего несколько месяцев назад и рано узнал об одном важном аспекте создания события в календаре, – это понимание того, в каком временном поясе, относительно как создателю события, так и для любых других участников. Анкет Естественно, это включает в себя много математики часового пояса. Большая часть этого делается pytz Библиотека, и это работает достаточно хорошо для нас. Зачем сами то, что кто -то еще сделал, верно?

Введите Microsoft. Многие компании используют Microsoft Exchange для своей электронной почты и календаря работы. Исторический, обмен использовал протокол под названием Exchange ActiveSync (EAS). Как и в случае с любым протоколом Microsoft, их отношение к их календарному API, похоже, было: «Давайте предоставим все необработанные данные и сделаем пользователю сделать что -то полезное с ним. “Они предоставляют:

  • Смещение от UTC за считанные минуты
  • Дата в течение того календарного года, когда часовой полки переходит на дневное время
  • Дата в течение того календарного года, когда часовой пост переходит к стандартному времени
  • Смещение во время экономии дневного света

… из которого вы должны получить дружеское имя, чтобы показать пользователю. Как будто если бы я попросил вас за время, и вы ответили, рассказав мне о вращении и наклоне Земли, эксцентричностью орбиты Земли, приливном воздействии луны на вращательную скорость и о том, как настраивать в течение секунды. Я имею в виду, конечно, но вы не можете просто сказать мне, что это 5:30? *

Pytz имеет довольно разреженную публичную API (где «публика» определяется с использованием идиомы классов и методов Python, не префиксированных подчеркиванием). Вы, программист, создаете создание объекта часового пояса от подростенной строки, такой как США/Восточный и вы можете использовать локализовать , Нормализовать и utcoffset Методы для работы с этим. Pytz заботится о отслеживании переходов и смещений DST. С точки зрения обычного пользователя, это имеет смысл. Все ценностное предложение Pytz состоит в том, чтобы абстрагировать боль, которая имеет дело с часовыми поясами, а также бюрократией и политики в отношении замены смещений. Но хорошо, Редмонд, игра.

Мы решили использовать внутренние внутренности PYTZ, чтобы создать таблицу поиска для их хранения. Нам нужно использовать информацию, которую мы получаем от Microsoft в качестве ключа, и имя часового пояса в качестве значения. Для каждого временного питания PYTZ хранит атрибут _utc_transition_times

>>> tz = pytz.timezone('US/Eastern')
>>> pprint(tz._utc_transition_times[-5:])
[datetime.datetime(2035, 11, 4, 6, 0),
 datetime.datetime(2036, 3, 9, 7, 0),
 datetime.datetime(2036, 11, 2, 6, 0),
 datetime.datetime(2037, 3, 8, 7, 0),
 datetime.datetime(2037, 11, 1, 6, 0)]

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

>>> daylight_time = tz._utc_transition_times[n]
>>> standard_time = tz._utc_transition_times[n+1]
>>> utc_offset = tz.utc_offset(date_not_in_dst)
>>> timezone_table[(daylight_time, standard_time, utc_offset)] = timezone_name

Это сработало хорошо, пока мы не получили отчет об ошибке, что события календаря в Окленде теряют информацию о часовом поясе. Посмотрев на это, оказалось, что наша таблица поиска имела обратное Daylight_time и standard_time записи. Как это могло произойти? Что ж, оказывается, что мы сделали очень плохое предположение, когда предполагали, что первый переход в год – это переход к DST. Поскольку лето Южного полушария составляет с декабря по март, они отправляются в DST примерно в ноябре и выходят около апреля следующего года. Может быть, Картографы для социального равенства был прав! Мы не осознавали эту разницу между северным и южным полушариями и были ошибочными из -за этого. Вернуться к доске для рисования.

Копание в питце

Хорошо, так что немного больше копания в PYTZ оправдано. Как именно работает эта библиотека? Оказывается, это действительно увлекательно. В комплекте с кодовой базой является база данных OLSON, иначе известная как ZENINFO или TZ база данных. Вся база данных записана в стиле UNIX, с файлами открытого текста, описывающими имена часовых поясов и исторические смещения для каждого географического региона. Но даже более заметными, чем фактические данные, являются историческими анекдотами и контекстом, разбросанными в качестве комментариев. Некоторые из них большие, некоторые маленькие, а некоторые, казалось бы, только там, как внутренние шутки между сопровождающими.

Например, на Аляске:

От Пола Эггерта (2017-06-15):

… Многие жители Аляски не знали о приобретении Аляски в США, гораздо меньше любого календаря или изменения времени. Тем не менее, российская часть Аляски наблюдала за русским временем, и более точно моделировать это, чем игнорировать его. Формат базы данных требует точного времени перехода; Используйте российский салют как несколько арбитражное время для формальной передачи контроля для всей Аляски. Sitka’s UTC Offset -9: 01: 13; Отрегулируйте его 15:30 до местного времени других мест на Аляске, чтобы они менялись одновременно.

От Пола Эггерта (2014-07-18):

Одно мнение о беспорядках в начале 1980-х годов на Аляске во времени появилось дневное время, когда граффити на стене аэропорта Джуно:

“Добро пожаловать в Джуно. Пожалуйста, верните свои часы в 19 веке “.

Смотрите: Тернер У. Аляска четыре часовые пояса теперь два. NY Times 1983-11-01 http://www.nytimes.com/1983/11/01/us/alaska-s-four-time-zones-now-two.html

И на Мичигане:

От Пола Эггерта (1999-03-31):

Shanks пишет, что Мичиган начал использовать стандартное время в 1885-09-18 гг., Но Howse пишет (стр. 124-125, ссылаясь на популярную астрономию, 1901-01), что Детройт сохранил по местному времени до 1900 года, когда городской совет постановил, что часы должны быть поставлены Вернувшись двадцать восемь минут до центрального стандартного времени. Половина города повиновалась, наполовину отказалась. После значительных дебатов решение было отменено, и город вернулся в солнечное время. Процессорное предложение построить солнечный балл перед мэрией было передано в Комитет по канализации. Затем, в 1905 году, центральное время было принято городским голосованием.

Эта история слишком интересна, чтобы быть ложной, так что иди с Хоуз над Шенкс.

Часовые пояса политические – кто знал? Помимо шуток, я хотел посмотреть, как на самом деле Pytz сделки с течением времени. Это происходит в локализовать Метод в классе часового пояса. локализовать Попытки охватить все базы для странных переходов часового пояса. Чтобы сделать это, это пополам _utc_transition_times Чтобы найти, где данное время попадает в список переходов. Затем он получает информацию о переходе из _transition_info Анкет

>>> tz = pytz.timezone('US/Eastern')
>>> pprint(tz._utc_transition_times[:5])
[datetime.datetime(1, 1, 1, 0, 0),
 datetime.datetime(1901, 12, 13, 20, 45, 52)
 datetime.datetime(1918, 3, 31, 7, 0),
 datetime.datetime(1918, 10, 27, 6, 0),
 datetime.datetime(1919, 3, 30, 7, 0)]
>>> pprint(tz._transition_info[:5])
[(datetime.timedelta(-1, 68640), datetime.timedelta(0), 'LMT'),
 (datetime.timedelta(-1, 68400), datetime.timedelta(0), 'EST'),
 (datetime.timedelta(-1, 72000), datetime.timedelta(0, 3600), 'EDT'),
 (datetime.timedelta(-1, 68400), datetime.timedelta(0), 'EST'),
 (datetime.timedelta(-1, 72000), datetime.timedelta(0, 3600), 'EDT')]

Это рассказывает гораздо лучшую историю. Для каждой записи в _utc_transition_times , есть соответствующая запись в _transition_info Анкет Смещение DST в этой записи сообщает нам, является ли это переходом на ST (если он нулевой) или DST (Если это не так). Кроме того, смещение UTC существует непосредственно, а не требует отсчета для проверки.

Так каковы случаи краев здесь? Что ж, оказывается, что когда вы используете информацию о часовом поясе для определения имени, есть несколько возможных записей. Это может не удивить вас полностью, чтобы узнать, что для часового пояса есть разные названия, представляющие как Москву, так и Турцию. Но если вы не осторожны, легко перезаписать «Европу/Москву» или «Европу/Стамбул» (общие представления этого часового пояса) с «W-Su» (для Западного Советского Союза).

Кроме того, просто глядя на локализовать Метод показывает целый ряд краевых случаев. Существует, казалось бы, очевидный случай попытки справиться со временем в рамках перехода, например, 1:30 утра в день перехода от DST в ST времени до или после перехода? Но есть и другие случаи, когда страны возвращают свои часы за пределами перехода DST. Это может вызвать проблемы для тех, кто пытается провести конверсию в режиме реального времени между часовыми поясами.

К счастью, это то, на что мы можем положиться на PYTZ. Несмотря на то, что Pytz не идеальна, охватывает как можно больше случаев краев, при решении одной из худших проблем для программирования. Несмотря на то, что нам нужно работать с более тонкими точками переходов часового пояса, чтобы расшифровать события обмена, мы обычно можем просто использовать API Fine Pytz в другом месте.

Если вы хотите узнать больше об API Nylas Calendar, вы можете получить бесплатный ключ API по регистрация здесь Анкет

* Я поместил эту аналогию специально, чтобы первого человека мог взглянуть на меня, чтобы спросить меня, в каком часовом поясе есть 5:30.

Оригинал: “https://dev.to/nylas/how-i-found-myself-learning-about-time-changes-in-the-western-soviet-union-3k0e”