Рано чи пізно, кожен програміст стикається з часовими поясами.
У мене нема порад з цього приводу; тож розкажу бувальщину
про те, чому ви ніколи в житті не повинні мати справу з часовими поясами.
Уявімо, що хтось написав програму,
що рахує, скільки секунд тому щось відбулося.
Ви вводите дату та час, а вона видає кількість секунд.
Користувач дивиться на програму і каже: "Круто,
але чому б не додати поле для вибору часового поясу?"
Зможемо дізнатися, скільки часу пройшло між зараз у Нью-Йорку та п'ятьма днями тому в Лондоні.
І це чудово -- новий випадаючий список дозволяє рухатися ліворуч і праворуч від Грінвіча.
Прекрасно.
Програма стає популярною, і врешті йому дзвонять з Австралії.
І чується: "Здоровеньк..."
-- ні, я не повинен імітувати.
Я не буду імітувати діалекти.
Австралія каже: "Привіт!"
"Зверніть увагу, що ми на 9½ годин випереджаємо Грінвіч."
"Справді?!"
"Так, 9 з половиною!"
"Добре, додамо спеціальний варіант для вас."
Згодом, хтось зателефонує з Непалу.
Скаже: "Привіт. Ми попереду Грінвіча на 5¼ годин."
"Це правда! Ми живемо так віками. 5 із чвертю годин."
Гаразд. Додано спеціальний варіант.
Можна також скористатися канонічною картою часових поясів
і подбати, щоб кожна часова зона була присутня у вашому списку.
А тоді настане осінь.
І подзвонять з Англії.
Англієць скаже: "Перепрошую, ми на годину попереду, що трапилося?"
"Ми вже перевели годинники!"
Ми ж врахували це.
Ми заклали в програму момент переходу на зимовий час!
А англієць заперечує: "Ні, в нас він настає на тиждень раніше."
"Це залежить від того, де ти живеш."
"Ми повертаємо годинну стрілку назад на тиждень раніше за вас."
На цьому етапі
зазвичай програміст починає хапатися за голову,
усвідомлюючи, у що вляпався.
Але нічого! Він додасть
у програму дату переходу на літній час для кожної країни.
Треба лише скопіювати відповідний список.
Тоді подзвонять з південної півкулі,
щоб нагадати, що там восени додають годину, а не віднімають.
"Наша весна... в листопаді."
Тут програміст починає тоскно поглядати на свій улюблений п'янкий напій,
міркуючи, чи слід йому відсьорбнути перед тим, як продовжувати.
...Але він додасть потрібний код.
А тоді зателефонують із Самоа.
Десь в Тихому океані, на лінії зміни дат.
Скажуть: "Привіт!"
"Ми перестрибнули один день."
"Що?"
"Еге ж. Після 29-ого грудня 2011 року настало 31-ше."
"Ми перетнули лінію зміни дат, ставши на багато годин попереду Грінвіча..."
"...замість багатьох годин позаду. Сприяє торгівлі з Австралією."
"Можете взяти це до уваги, рахуючи секунди, що спливли з часу минулих подій?"
[важко дихаючи] Все гаразд, беремо також перелік країн, що міняли часовий пояс,
і він доволі довгий.
Але про це повідомляють заздалегідь, тому
код можна буде вчасно оновити, нема проблем.
Тоді ви відмотуєте назад і дізнаєтесь, що під час Другої світової
Англія мала подвійний літній час.
Спершу повністю перейшли на літній час, а тоді додали годину.
Вони на дві години випередили Грінвіч... живучи на Грінвічі.
Ви враховуєте і це.
Помітили, що я перестав згадувати програміста?
Це тому, що я сам мав із цим справу, і це вкрай печально.
Тоді ви підключаєте список
випадків зміни часових поясів різними країнами -- що траплялося безліч разів!
Іноді по кілька на рік, бо влада мінялася.
І тоді цьому вигаданому програмісту дзвонять із Лівії,
де в 2013-му передумали повертати стрілки назад всього за пару днів до того, як це мало статися.
Попередили так пізно, що ніхто не встиг перелаштуватися.
Кожен комп'ютер у Лівії, незалежно від операційної системи,
відстав на годину.
Ну нехай, ви прочитали новини і тому квапливо заносите все в програму.
І тут дзвонять із Західного берега ріки Йордан.
Його ізраїльське та палестинське населення використовують різні часові пояси.
Одні визнають Ізраїль, а інші ні.
Ми маємо людей на одному й тому ж клаптику землі, які використовують різний час.
Вони повинні ідентифікувати себе, щоб визначити, за чиїм годинником жити.
Занести це в програму неможливо! А тоді...
телефонує історик.
Каже: "Дивись, я хочу ввести дату аж з 18 століття."
"Ми тоді перейшли від Юліанського календаря до Григоріанського."
"Не те щоб ми втратили три тижні...
просто опустили їх, перемістившись одразу до оцієї дати."
"Ти б міг додати це в код, щоб воно мені порахувало?"
Все добре, ви вже знаєте про ці дати
і закодовуєте їх у свою програму,
але тепер вона стала довжелезна і заплутана,
код схожий на купу спагеті, але якимось дивом працює.
А тоді дзвонить історик з Росії!
Каже: "Ми перейшли на Григоріанський календар аж у 20 столітті...
але різні території зробили це в різний час...
можеш і це дописати?" А тоді дзвонить британський історик!
Каже, що поки не настало 16 століття...
новий рік починався 25 березня!
Приголомшливо.
Після 24 березня 924 року
настало 25 березня 925 року. Минув один день.
А після 31 грудня 924 року було 1 січня 924!
Шалене безладдя. А ТОДІ...
телефонує астрофізик...
І каже: "А ми щойно додали високосну секунду!"
Тут у вас вихоплюється "Якого...."
Високосні секунди; адже Земля обертається зі змінною швидкістю,
яка коливається туди-сюди через рух тектонічних плит
і зміни в магнітному полі, щось таке. Тому іноді
Міжнародне астрономічне об'єднання призначає високосну секунду.
Тоді годинник переходить від 23:59:58
до 23:59:59,
і замість того, щоб поводитись як усякий порядний годинник,
іде до 23:59:60!
Все летить шкереберть, адже ми отримали 61 секунду в хвилині!
Тому, залежно від методу,
ваш годинник або відстає на секунду від усього світу,
або повторює секунду.
За задумом, допомогти має такий собі час UNIX.
Здається, Numberphile уже розповідав про нього.
Це лічильник, який стартував водночас із першою секундою 1970 року
і збільшується на секунду щосекунди.
Весь час. Цок. Цок. Цок.
Це здорово, адже ви можете просто взяти потрібну дату,
конвертувати у вигляді часу UNIX
і занести у вашу базу даних.
Це розв'яже проблему високосних секунд.
НАСПРАВДІ НІ! Звісно, ні!
Адже є Міжнародний координований час,
який включає високосні секунди!
Він просто включає 23:59:60.
А ще є астрономічний час, який НЕ включає високосних секунд
і поступово віддаляється від світового,
тому що його закладено в телескопи, крізь які ми дивимось на зірки!
[важке зітхання]
Ви усвідомлюєте
після всієї мороки з часовими поясами, що вам треба
махнути рукою на ваш код
і не намагатися писати щось іще.
Слід звернутися на людей, що вже були на вашому місці.
Перших людей, які мали з цим справу
і написали вермішелеподібний код.
Ви красно дякуєте за те, що вони зробили код відкритим,
додаєте його в свою програму, зазначивши їхнє авторство,
і ніколи більше не дивитись на нього.
Тому що там криється божевілля.
Google самостійно винайшов хороший підхід до високосних секунд.
В них у блозі є стаття з поясненням.
Вони називають його "високосне накопичення"'
Оскільки мати хвилину з 61 секундою
чи змушувати годинник іти назад
шкодить гігантській корпорації,
яка має дбати, щоб кожен біт даних був збережений достеменно тоді, коли слід,
Google розпорошує додаткову секунду на весь день,
додаючи мікросекунду з кожним рухом стрілки.
Цок, цок, цок, і так один день.
Тому іноді вони можуть відставати на півсекунди від світу,
але зате всі їхні сервери живуть за цим часом.
Він іде не в такт зі світовим, але зате дає певність у тому, що сталося до, а що після.
Синхронізація важливіша за точний час.