Працюємо з датами широкого діапазону в php

Персональна сторінка shra, блог фріленсерів, веб-розробника на PHP. Тут я ділюся своїм досвідом і думками, проводжу досліди над людьми, збираю нематеріальні свідоцтва власної дурості. Використовуючи приклади програмного коду з даного сайту, ви приймаєте всю відповідальність за можливі наслідки їх використання, включаючи ваше психічне здоров'я і інтереси третіх осіб.

Блог / PHP / Працюємо з датами широкого діапазону в PHP

Проблема 2038 року.

Робота з датами пізніше 2038 (і раніше 1900 року).

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

По-перше, напевно, одним з рішень буде розширення змінної до 64 біт, що дозволить охопити період в 292 млрд. Років. Так збережуть сумісність зі старими програмами, хоча їх потрібно буде перекомпілювати, виконати якісь оновлення баз даних і т.п.

А ще через 250 млрд. Років змінну розширять до 1024 бітів, на той випадок, якщо всесвіт все ж розвивається не циклічно (пару слів про великий вибух) :).

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

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

Повертаючись від теорії до практики, тобто до PHP, ми маємо два хороших рішення. Одне з них - це використання класу DateTime. Друге рішення ми знаходимо, пам'ятаючи про те, з чим зазвичай в зв'язці використовується PHP. Це - бази даних, в яких ми найчастіше маємо багатий арсенал роботи з таким типом даних як DATETIME. З баз даних я буду розглядати MySQL, для конкретики.

Клас PHP DateTime.

Даний клас дозволяє працювати з часом в межах від '0000-00-00 00:00:00' до '9999-12-31 23:59:59'. Що далеко за межами unix epoch. Цей клас взагалі-то працює ще в більших межах. Спробуйте, наприклад, ось такий код:

Але форматувати об'єкт датою старше 10000 року вам не вдасться, тому будемо вважати, що названий вище діапазон є робочим.

Так як форматування дати сумісно з форматом функції date (), то ви зможете отримати будь-яку «звичну» інформацію про дату.

Тип даних DATETIME в MySQL.

Даний тип зберігання часу охоплює діапазон часу (згідно з документацією) від '1000-01-01 00:00:00' до '9999-12-31 23:59:59'. На 1000 років поменше, ніж перший варіант :), але набагато ширше unix epoch.

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

Ось приклад такого запиту, де ми виконуємо ряд потрібних нам розрахунків дати і часу.