Правильний погляд на тимчасові зони в php

Що таке UTC

Формат UTC розшифровується як «Всесвітньо координований час» і є наступником «Середнього часу за Гринвічем» (GMT). Ці два формати практично ідентичні, але UTC вважається прийнятим стандартом. Загалом, UTC ґрунтується на виділенні 40 різних часових зон. За точку відліку в UTC прийнято брати 00:00 годин. Разом виходить 12 основних тимчасових зон, як з позитивним, так і з негативним значенням, а також деякі додаткові тимчасові зони, на зразок півгодинних UTC +04: 30. Ідея полягає в тому, що якщо у вас є тимчасова зона UTC -05: 00. то вам доведеться відняти 5 годин від початкового UTC +00: 00. щоб домогтися потрібного відповідності. Тобто, якщо це 14:00 (або 2 години вечора) а ваша тимчасова зона UTC-05: 00 (EST або Східний часовий пояс), то UTC +00: 00 буде дорівнює 19:00 (або 7 години вечора).

Зберігання часу в форматі UTC +00: 00

Перше, що ми повинні зробити, - визначитися, яку тимчасову зону використовувати для зберігання всіх наших значень. Я настійно рекомендую взяти за основу UTC +00: 00 - без особливої ​​причини, крім як тієї, що її легко запам'ятати і 0 являє собою ідеальну точку відліку. Так як ми знаємо, що всі дати вказані в UTC +00: 00. стає набагато легше представляти належний час для кожного користувача на основі їх особистих тимчасових зон. Після того як користувач вибрав (або у нас є автоопределение) свій часовий пояс, висновок відповідного часу для цього користувача стає звичайною справою.

Установка часового поясу за умовчанням

Вважаючи, що всі наші дати / час зберігаються в форматі UTC, ми можемо просто встановити за замовчуванням тимчасову зону, яка буде використовуватися для відображення кожного часу. Це дозволить автоматично підібрати дату і час для конкретного користувача. У PHP все, що нам потрібно зробити, - це встановити тимчасову зону, наприклад, так:

Ми можемо зробити це в якомусь блоці ініціалізації на початку нашого коду - і все готово: всі дати будуть відображатися належним чином для того часового поясу, в якому знаходиться користувач.

Якщо ми хочемо отримати повний контроль над датою і часом, ми можемо побудувати функцію наступним чином:

Налаштування PHP під UTC +00: 00

Звичайно, все було б не так просто, якби ми не налаштували нашу систему під UTC, як тимчасову зону за замовчуванням. Я впевнений, що це може бути зроблено приблизно однаково і в інших мовах, але PHP це робиться в такий спосіб:

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

Якщо у нас не було доступу до зміни конфігурації PHP, то ми повинні налаштувати час вручну при установці дати, ось так:

Налаштування MySQL під UTC +00: 00

Безпосередня установка дати, як ми робили вище, може бути застосована, якщо у нас немає доступу до зміни параметрів конфігурації MySQL. Проте, якщо ми хочемо використовувати TIMESTAMP. яка зазвичай самообновляющиеся, або таку функцію дати з MySQL, як NOW (). то ми повинні налаштувати MySQL для використання UTC як тимчасовий зони за замовчуванням.

В MySQL це робиться шляхом установки UTC зміщення, яке може бути зроблено так само легко, як це було в PHP, шляхом внесення наступних змін:

Оновлення існуючих дат / часу

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

На щастя, MySQL надає зручну функцію, яка дає нам можливість легко оновлювати існуючі часові пояси.

ПРИМІТКА: Якщо у вас є які-небудь тимчасові мітки, то їх потрібно оновити в першу чергу.

Ми можемо здійснювати пошук по всіх полях дати і часу в нашій базі за допомогою наступного запиту:

Звідси ми можемо виконати такий запит, щоб оновити дати / час в наших таблицях:

Де -05: 00 - поточна тимчасова зона, в форматі якої зберігається час (вона як і в попередньому випадку відноситься до Східної). Часовий пояс +00: 00. в яку ми хочемо перетворити, в даному випадку відноситься до UTC.