Как правильно организовать хранение дат и выборку с учетом TZ?

Хранение дат в PHP можно разделить на два основных подхода: хранение даты в формате Unix timestamp или хранение даты в формате строки. Выбор подхода будет зависеть от требований вашего проекта.

1. Хранение даты в формате Unix timestamp:
Unix timestamp - это количество секунд, прошедших с 1 января 1970 года UTC. При использовании этого подхода вы можете использовать функции time() для получения текущего timestamp или функцию strtotime() для преобразования строки с датой в timestamp. Хранение даты в этом формате обеспечивает универсальность и совместимость, поскольку timestamp не зависит от временных зон и позволяет легко выполнять операции сравнения и математические операции с датами.

Пример:

$timestamp = time(); // текущий timestamp
$date = date('Y-m-d H:i:s', $timestamp); // преобразование timestamp в строку даты

$timestamp = strtotime('2022-01-01'); // преобразование строки даты в timestamp

2. Хранение даты в формате строки:
Если вам важно иметь более читаемое представление дат в базе данных или в файловой системе, вы можете хранить даты в формате строки. В этом случае рекомендуется использовать формат даты, совместимый с ISO 8601 (например, 'Y-m-d H:i:s'). При работе с датами в этом формате важно учитывать временные зоны для корректного преобразования дат между временными зонами.

Пример:

$date = date('Y-m-d H:i:s'); // текущая дата в строковом формате

$datetime = new DateTime('2022-01-01 12:00:00', new DateTimeZone('Europe/Moscow')); // создание объекта DateTime с указанной временной зоной
$datetime->setTimezone(new DateTimeZone('America/New_York')); // изменение временной зоны
$dateString = $datetime->format('Y-m-d H:i:s'); // преобразование объекта DateTime в строку

Для выборки и отображения дат с учетом временных зон вы можете использовать функции и классы PHP, предоставляющие возможности работы с временными зонами:

- Функция date_default_timezone_set() позволяет установить временную зону для работы с датами по умолчанию.
- Функции date() и strftime() позволяют форматировать даты с учетом временной зоны.
- Класс DateTime и его методы позволяют работать с датами с учетом временной зоны и выполнять операции сравнения и математические операции с датами.

Пример:

date_default_timezone_set('Europe/Moscow'); // установка временной зоны по умолчанию

$date = date('Y-m-d H:i:s'); // текущая дата с учетом временной зоны по умолчанию

$datetime = new DateTime('2022-01-01 12:00:00', new DateTimeZone('America/New_York')); // создание объекта DateTime с указанной временной зоной
$datetime->setTimezone(new DateTimeZone('Europe/Moscow')); // изменение временной зоны
$dateString = $datetime->format('Y-m-d H:i:s'); // преобразование объекта DateTime в строку с учетом временной зоны

Надеюсь, эта информация поможет вам правильно организовать хранение дат и выборку с учетом временных зон в PHP.