Открыть сервис

Datetime: представление даты и времени

Datetime — в вычислительной технике и программировании — тип данных или формат представления, объединяющий календарную дату и время суток в едином значении. Используется для фиксации моментов времени, хронологической сортировки событий и выполнения арифметических операций с интервалами.

Определение и назначение

Термин datetime происходит от слияния английских слов date (дата) и time (время). В отличие от раздельного хранения даты и времени, комбинированный тип позволяет однозначно идентифицировать конкретный момент в пределах суток и календаря. Основное назначение — машинное представление момента времени, пригодное для сравнения, вычисления разниц и отображения в различных форматах.

В реляционных базах данных тип DATETIME (или TIMESTAMP) является стандартным для хранения операционных записей: времени создания заказа, отправки сообщения, изменения записи. В языках программирования соответствующие классы (например, datetime.datetime в Python, DateTime в C# и PHP) предоставляют методы для создания, парсинга и форматирования значений.

Составные части и точность

Значение datetime включает несколько компонентов:

  • год (обычно от 1 до 9999);
  • месяц (1–12);
  • день (1–31, с учётом длины месяца и високосных лет);
  • час (0–23 или 1–12 при использовании AM/PM);
  • минута (0–59);
  • секунда (0–59, иногда с долями);
  • сдвиг относительно UTC (часовой пояс).

Точность хранения долей секунды зависит от реализации: в MySQL DATETIME по умолчанию хранит секунды, но поддерживает дробную часть до микросекунд (6 знаков); в PostgreSQL тип timestamp позволяет хранить точность до микросекунды; в языке Java класс LocalDateTime фиксирует наносекунды.

Отличия от смежных типов

Следует различать datetime и смежные понятия:

  • Date — только календарная дата, без времени суток.
  • Time — только время, без привязки к дате.
  • Timestamp — в ряде СУБД (например, MySQL, PostgreSQL) — тип, аналогичный datetime, но с привязкой к часовому поясу и ограниченным диапазоном (в MySQL — с 1970 по 2038 год в версиях до 5.6). В PostgreSQL TIMESTAMP WITH TIME ZONE хранит момент времени в UTC.
  • Unix time — целое число секунд, прошедших с 1 января 1970 года; не является календарным представлением, но легко конвертируется в datetime.

Хранение в базах данных

В SQL-стандарте определены типы DATE, TIME и TIMESTAMP. Реализации различаются:

СУБДТипДиапазонОсобенности
MySQLDATETIME1000-01-01 — 9999-12-31Не зависит от часового пояса сервера
MySQLTIMESTAMP1970-01-01 — 2038-01-19Автоматически конвертируется в UTC
PostgreSQLTIMESTAMP4713 до н.э. — 294276 н.э.Поддержка точности до микросекунд
SQL ServerDATETIME20001-01-01 — 9999-12-31Точность до 100 наносекунд
SQLiteTEXT/INTEGERнет ограниченийХранится как текст ISO 8601 или Unix-время

При проектировании баз данных выбор между DATETIME и TIMESTAMP определяется необходимостью учёта часовых поясов: если приложение работает в одном регионе, достаточно DATETIME; для глобальных систем предпочтителен TIMESTAMP WITH TIME ZONE.

Форматы представления

Наиболее распространённый текстовый формат — ISO 8601: 2025-03-14T09:26:53+03:00. Буква T разделяет дату и время; сдвиг указывается относительно UTC. Такой формат однозначен, лексикографическая сортировка совпадает с хронологической, что удобно для индексации.

Локальные форматы различаются по странам: в России принят порядок «день.месяц.год» (14.03.2025 09:26), в США — «месяц/день/год» (03/14/2025 09:26 AM), в Японии — «год-месяц-день». Для интернационального обмена данными стандарт ISO 8601 является рекомендованным.

Работа с datetime в языках программирования

Современные языки предоставляют богатые библиотеки для работы с датой и временем:

  • Python — модуль datetime (классы date, time, datetime, timedelta), а также сторонняя библиотека pytz для работы с часовыми поясами.
  • JavaScript — встроенный объект Date хранит время в миллисекундах с 1970 года; для сложных операций используется библиотека date-fns или Luxon.
  • Java — пакет java.time (классы LocalDateTime, ZonedDateTime, Instant), появившийся в Java 8.
  • C# — структура DateTime в пространстве имён System.
  • PHP — класс DateTime с методами format(), modify(), diff().

Типичные операции: получение текущего момента (now()), разбор строки (parse, strptime), форматирование вывода (strftime, toString), вычисление разницы между двумя моментами, добавление интервала (дней, месяцев, лет).

Часовые пояса и летнее время

Ключевая сложность работы с datetime — учёт часовых поясов и переходов на летнее время. Значение без указания пояса называется «наивным» (naive) и интерпретируется в локальном времени системы. «Осведомлённое» (aware) значение содержит смещение от UTC.

Переход на летнее время создаёт неоднозначности: осенью один и тот же локальный час встречается дважды, весной — час пропускается. Корректная обработка требует использования базы данных часовых поясов IANA (tzdata), которая содержит исторические правила переходов для всех регионов мира.

Особенности и ограничения

  • Високосные секундыМеждународная служба вращения Земли периодически добавляет дополнительную секунду к UTC; большинство компьютерных систем игнорируют это или обрабатывают через специальные механизмы.
  • Проблема 2038 года — для 32-битных систем, хранящих время как знаковое целое секунд от 1970 года, наступит переполнение 19 января 2038 года.
  • Календарная реформа — переход России на григорианский календарь в 1918 году (пропуск 14 дней) создаёт сложности при обработке исторических дат.
  • Нулевой год — в григорианском календаре отсутствует, что учитывается в некоторых библиотеках.

Применение

Datetime используется повсеместно: в журналах событий (логах), системах бронирования, финансовых операциях, планировщиках задач, метаданных файлов (время создания и модификации), протоколах сетевого взаимодействия (заголовки HTTP, электронная почта). В научных вычислениях datetime применяется для привязки измерений и данных телеметрии.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →