?

Log in

No account? Create an account
   Journal    Friends    Archive    Profile    Memories
 

Timezones explained - morfizm

Sep. 28th, 2017 11:48 pm Timezones explained

Хорошее видео, про временные зоны (на английском).


Я знал про это уже давно. У меня был проект в 2013 году, система для прогнозирования роста количества продуктов по категориям, объёмов трафика и других метрик. Она агрегировала метрики из разных источников, вычисляла различные статистики. Проект наудивление живуч, ещё используется по сегодняшний день. Помню, что я настоял на design decision, что вся дата и время будет в UTC, и в сутках 86400 секунд, no matter what. Причём я даже не делал перевод в локальное время для отображения. Все тулы выдавали UTC даты и брали в качестве входа даты в UTC. Агрегация суточных метрик начиналась в 00:00:00 каждого UTC дня, вне зависимости от страны, рынка и прочих деталей. Я прикидывал, что дешевле будет один раз объяснить пользователям, что все даты в UTC, и что день такой-то в североамериканском регионе представлен двумя UTC днями, чем заниматься сексом с переводом дат. Пользователи привыкли, а все, кто поддерживали систему после этого, были довольны этим решением :)

20 comments - Leave a commentPrevious Entry Share Next Entry

Comments:

From:metaller
Date:September 29th, 2017 06:51 am (UTC)
(Link)
Круто что настоял, уважаю.
From:morfizm
Date:October 2nd, 2017 03:46 am (UTC)
(Link)
Спасибо
From:_m_e_
Date:September 29th, 2017 07:01 am (UTC)
(Link)
Ой, не напоминай.
Я майкрософтовские логи (Bing/AdCenter) два года переводил с PST (что ровно два раза в год ломало что-то новое в различных пайплайнах) на UTC. Ну то есть мы предложили простенький многошаговый дизайн как сделать это без остановки производства и одновременной революции в десятке команд сразу, и потом всех пинали, чтобы они очередной шаг сделали. Ну ничего, перешли, но вспоминать не хочу :)
Придя в Гугл я заново ужаснулся. Хотя тут все работает! Вот последнего я до сих пор не понимаю.
А ты молодец.

Edited at 2017-09-29 08:02 am (UTC)
From:archaicos
Date:September 29th, 2017 08:20 am (UTC)
(Link)
Кстати, интересно, винда до сих пор не умеет жить по UTC времени в BIOS?
Вроде есть хак:
https://superuser.com/questions/975717/does-windows-10-support-utc-as-bios-time


Edited at 2017-09-29 08:24 am (UTC)
From:_m_e_
Date:September 29th, 2017 08:29 am (UTC)
(Link)
Никогда этим не занимался ;)
В датацентре все на старте синхронизируется, независимо от биоса.
From:morfizm
Date:October 2nd, 2017 03:57 am (UTC)
(Link)
Молодец - это ты. Перевод уже существующей системы на UTC - задача совершенно другого порядка, несравнимо сложнее :)

В Гугле мне повезло - я с датами вообще дела не имел.

From:dennyrolling
Date:September 29th, 2017 07:31 am (UTC)
(Link)
я тоже за одну таймзону, но PST :)

а то у нас в какой-то странной системе было время в UTC и пришлось ставить в хром экстеншин типа "UTC часы"
From:morfizm
Date:October 2nd, 2017 03:55 am (UTC)
(Link)
Зимой привыкнешь, что время правильное, а летом заебёшься прибавлять/отнимать час :)
From:dennyrolling
Date:October 2nd, 2017 06:48 am (UTC)
(Link)
летнее время тоже отменить. оно нифига не нужно!
From:rezkiy
Date:September 29th, 2017 07:46 am (UTC)
(Link)
Мне кажется что с суточными метриками тебе случайно повезло -- так как вечер пятницы в США имеет смысл агрегировать с выходными.

С технической стороны, я знаю про ту секунду, но как ты и где ее обрабатывал?

Я кстати думаю волюнтаристски перевести все часы на utc в нашем продукте, интересны подводные камни.
From:morfizm
Date:October 2nd, 2017 03:54 am (UTC)
(Link)
Там не очень повезло, потому что пик продаж в США, к которому готовится вся компания, приходится примерно на 6-7 вечера в Cyber Monday, а в UTC координатах это проходит по границе между двух дней. Впрочем, я выкрутился, сделав для важных метрик вариант агрегации "weekly moving p100" (максимум по сегодняшним значениям, +/- 3 дня).

Лишнюю секунду никак не обрабатывал, у меня минимальный resolution агрегации был минута. Но я явно упомянул, что leap seconds не считаем, чтобы можно было легко работать с Unix Timestamp-style вычислениями, и делить интервал в секундах на 86400, чтобы получить дни.

Подводные камни... могу представить себе один: промежуточные вычисления. Например, у тебя на входе UTC, на выходе UTC, вроде всё в порядке? Но где-то внутри происходит преобразование в local tz и обратно, таким образом, что при переходе на летнее время всё ломается. Я бы потестировал заранее переход на летнее время.
From:rezkiy
Date:October 2nd, 2017 06:30 pm (UTC)
(Link)
Мне кажется что косяк будет только если перевести utc -> local, потом что-нибудь добавить или вычесть, а потом обратно в utc. Тогда при переходе на летнее время сломается. Если же использовать местное время только для отображения то вроде все чисто.
From:morfizm
Date:October 2nd, 2017 06:56 pm (UTC)
(Link)
Косяк может быть, если писать local одной библиотекой, а читать другой. Особенно около момента перехода между daylight savings time. Там баг на баге багом погоняет в этих библиотеках. Если использовать только для отображения (не для экспорта!) и только одним компонентом переводить - то должно быть чисто.
From:rezkiy
Date:October 2nd, 2017 09:04 pm (UTC)
(Link)
А ну да, в этом случае тоже.

Только для отображения. Постараюсь избежать вообще совсем.
From:morfizm
Date:October 2nd, 2017 04:00 am (UTC)
(Link)
> С технической стороны, я знаю про ту секунду, но как ты и где ее обрабатывал?

Я помню, что у нас query serving код содержал баг, который проявился, когда добавилась leap second, но там всё починили, и теперь все, кто об этом знает, просто держат в голове, что интервал по времени системных часов бывает и отрицательным. В большинстве случаев нормально проходит приравнивать его к нулю, если он отрицательный. Ну или пользоваться performance counter'ами вместо времени.
From:rezkiy
Date:October 2nd, 2017 06:31 pm (UTC)
(Link)
ага, std::chrono::steady_clock наше всё, я так и думал.
From:nastyushca
Date:September 29th, 2017 07:47 am (UTC)
(Link)

Классная видюха! Пацан молодец,  десять минут вещать про такую специфичную штуку с юмором и интерно - это талант!

From:morfizm
Date:October 2nd, 2017 03:56 am (UTC)
(Link)
Да, я его добавил в мемориз/подписался. Талантливый парень.
From:li111
Date:September 29th, 2017 08:22 am (UTC)
(Link)
Очень интересное решение с UTC.
Ты молодец!
From:morfizm
Date:October 2nd, 2017 03:56 am (UTC)
(Link)
Спасибо