Руководство по работе с датами и временем в Битрикс D7: класс DateTime

Работа с датами и временем в современных веб-приложениях — одна из ключевых задач. В платформе 1С-Битрикс существует собственный класс для удобного и безопасного манипулирования датами и временем — это класс DateTime. Он расширяет функциональность класса Date и значительно упрощает такие операции, как форматирование, парсинг, сравнение дат, операции с часовыми поясами и т. д.

Работа с датой и временем в Битрикс D7

В данной статье рассмотрим основные возможности DateTime на примерах, а также общие принципы работы с ним в рамках D7.


1. Общая информация о классе DateTime

1.1. Наследование от Date

Класс DateTime унаследован от Date. Это значит, что он поддерживает весь функционал класса Date, но предоставляет дополнительную возможность учитывать и время (часы, минуты, секунды). В результате в большинстве мест ядра 1С-Битрикс при работе с датами/временем используется именно DateTime.

1.2. Пространство имён

Библиотеки D7 в 1С-Битрикс используют неймспейсы. Чтобы работать с классом DateTime, необходимо указывать его полное пространство имён:

use Bitrix\Main\Type\DateTime;

Либо сразу обращаться к нему через:

\Bitrix\Main\Type\DateTime

2. Создание объекта DateTime

2.1. Конструктор

Самый очевидный способ создать объект класса DateTime — вызвать его конструктор. В конструктор можно передать строку с датой и временем в удобном вам формате, а также (необязательно) строку с форматом для парсинга.

Пример:

use Bitrix\Main\Type\DateTime;

// Пример 1. Создание объекта с текущими датой и временем
$currentDateTime = new DateTime();  // Если не передавать параметры, по умолчанию возьмется текущее время

// Пример 2. Создание объекта с указанием конкретной даты/времени
$dateString = '2025-03-10 15:30:00';
$dateFormat = 'Y-m-d H:i:s';
$customDateTime = new DateTime($dateString, $dateFormat);

// Пример 3. Создание объекта из даты без указания времени
// Система поставит время 00:00:00
$dateOnly = new DateTime('2025-03-10', 'Y-m-d');

2.2. Использование объекта Date при создании

Если у вас уже есть объект типа Date и вы хотите дополнить его информацией о времени, то при создании DateTime можно передать ему строку с временем отдельным параметром или внести изменения в сам объект Date методами класса. Однако в большинстве случаев, когда нужно управлять временем, изначально используют DateTime.


3. Форматирование и вывод дат

Форматирование даты и времени в D7 осуществляется стандартными механизмами PHP или методами, унаследованными классом DateTime. Например, для вывода даты в нужном формате чаще всего используют метод format().

use Bitrix\Main\Type\DateTime;

$dateTime = new DateTime();
echo $dateTime->format('d.m.Y H:i:s');
// Выведет что-то вроде: 12.03.2025 14:45:00

Метод format() принимает строку формата, в которой используются стандартные символы форматирования времени и даты в PHP (d, m, Y, H, i, s и т. д.).


4. Важные методы и операции

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

4.1. Получение Unix-времени (timestamp)

Иногда требуется получить «сырое» время в виде количества секунд с 1 января 1970 года (UTC). С помощью getTimestamp() можно получить это значение:

$timestamp = $dateTime->getTimestamp();
echo $timestamp;
// Например, 1742340300

4.2. Конвертация в различное локальное представление

При работе в разных часовых поясах или при локализации проекта под разные языки и региональные настройки — правильное отображение времени может оказаться нетривиальной задачей.

В Битрикс D7 предусмотрен метод toString() для получения строки в стандартном формате, принятом в Битрикс (обычно это YYYY-MM-DD HH:MI:SS), а также методы, позволяющие получать дату/время в том или ином виде.

Однако в большинстве случаев разработчики пользуются format(), чтобы явно указать желаемый вид строки.

4.3. Сравнение дат

Частая задача — сравнить две даты. Например, нужно понять, наступило ли определенное время, либо сколько дней между двумя датами. Объекты DateTime легко сравниваются через стандартные операторы PHP:

$dateTime1 = new DateTime('2025-03-10 10:00:00', 'Y-m-d H:i:s');
$dateTime2 = new DateTime('2025-03-10 12:00:00', 'Y-m-d H:i:s');

if ($dateTime1 < $dateTime2) {
    echo 'dateTime1 раньше dateTime2';
} else {
    echo 'dateTime1 позже или равно dateTime2';
}

Также можно вычислять разницу между датами методами, унаследованными от базовых PHP-классов (diff()) и при необходимости переводить результат в дни, часы и т. д.


5. Работа с часовыми поясами

5.1. Часовой пояс по умолчанию

Битрикс по умолчанию использует системный часовой пояс, который задан в настройках проекта. При создании объекта DateTime он автоматически будет учитывать конфигурацию часового пояса приложения (если вы не укажете что-то иное).

5.2. Установка другого часового пояса

Если требуется вручную задать часовой пояс для конкретной даты, можно воспользоваться стандартными средствами PHP (например, передав объект типа DateTimeZone):

use Bitrix\Main\Type\DateTime;

$tz = new \DateTimeZone('Europe/London');
$dateTimeLondon = new DateTime('2025-03-10 15:30:00', 'Y-m-d H:i:s', $tz);
echo $dateTimeLondon->format('Y-m-d H:i:sP');

В данном случае время будет интерпретироваться исходя из временной зоны Europe/London.


6. Основные примеры использования

Ниже приведено несколько распространённых сценариев, с которыми вы можете столкнуться при разработке под 1С-Битрикс.

6.1. Подстановка текущей даты/времени в поле ORM

При работе с ORM в D7, когда вам нужно записать в базу данных текущее время, достаточно создать объект DateTime без параметров:

use Bitrix\Main\ORM\Data\DataManager;
use Bitrix\Main\Type\DateTime;

class DemoTable extends DataManager
{
    public static function getTableName()
    {
        return 'demo_table';
    }

    public static function getMap()
    {
        return [
            'ID' => [
                'data_type' => 'integer',
                'primary'   => true,
                'autocomplete' => true
            ],
            'CREATED_AT' => [
                'data_type' => 'datetime',
                'required'  => true
            ],
            // ... остальные поля
        ];
    }
}

// При добавлении новой записи:
$result = DemoTable::add([
    'CREATED_AT' => new DateTime() // текущая дата и время
]);

if ($result->isSuccess()) {
    echo "Запись успешно добавлена!";
} else {
    echo "Произошла ошибка при добавлении записи!";
}

6.2. Фильтрация записей по дате

Чтобы выбрать записи за определённый день или временной промежуток, мы используем возможности ORM и DateTime.

$startDate = new DateTime('2025-03-10 00:00:00', 'Y-m-d H:i:s');
$endDate   = new DateTime('2025-03-10 23:59:59', 'Y-m-d H:i:s');

$rows = DemoTable::getList([
    'filter' => [
        '>=CREATED_AT' => $startDate,
        '<=CREATED_AT' => $endDate,
    ],
])->fetchAll();

foreach ($rows as $row) {
    echo $row['ID'] . ' — ' . $row['CREATED_AT']->format('d.m.Y H:i:s') . '
'; }

Такой код выберет все записи, созданные 10 марта 2025 года.

6.3. Операции над датами: добавление/вычитание интервала

При работе с объектами DateTime можно выполнять операции над датами — добавлять или вычитать дни, часы, минуты. Используется для этого стандартный интерфейс класса DateInterval (из PHP) и метод add() или sub().

$dateTime = new DateTime('2025-03-10 10:00:00', 'Y-m-d H:i:s');

// Добавим 2 дня
$dateTime->add(new \DateInterval('P2D'));
echo $dateTime->format('Y-m-d H:i:s');
// Итоговая дата будет 2025-03-12 10:00:00

// Вычтем 3 часа
$dateTime->sub(new \DateInterval('PT3H'));
echo $dateTime->format('Y-m-d H:i:s');
// Итоговая дата станет 2025-03-12 07:00:00

7. Рекомендации по работе с датами в Битрикс

  1. Используйте объекты DateTime. Избегайте хранения дат в виде обычных строк — это может приводить к некорректной работе при смене часового пояса, а также затрудняет форматирование и сравнение.
  2. Всегда указывайте формат при создании объекта из строки. Так вы явно даёте понять, как нужно парсить входные данные.
  3. Отдельно учитывайте часы, если они важны. Если во всех сценариях важно только число и месяц (например, это день рождения без точной информации о времени), можно использовать класс Date. Если же сценарии подразумевают часы и минуты, лучше сразу использовать DateTime.
  4. Будьте аккуратны с часовыми поясами. В разных окружениях (DEV, PROD) могут стоять разные временные зоны, а пользовательский интерфейс может требовать отображать локальное время клиента. В сложных случаях придётся использовать методы или настройки, которые учитывают часовой пояс пользователя.

Заключение

Класс DateTime в D7 — мощный инструмент для работы с датами и временем в 1С-Битрикс. Он предлагает удобный и унифицированный способ манипулировать временем, учитывая при этом нюансы PHP и особенности ядра Bitrix. Благодаря поддержке стандартных методов PHP (format(), diff(), add(), sub() и т. д.), вы можете гибко оперировать датами и обеспечивать корректность данных независимо от часового пояса и других факторов.

Используйте DateTime всякий раз, когда вам нужно работать с датами в Битрикс, и вы упростите себе жизнь, сделав код более чистым, читабельным и надёжным.

Теги:  Битрикс, руководство, D7

Интернет-магазин от 120 000 руб., срок от 4 недель

Платформа для продажи товаров или услуг. Включает интерактивные формы обратной связи в каждой карточке товара, а также множество статичных и динамичных разделов.

Корпоративный сайт от 60 000 руб., срок от 3 недель

Готовый информационный ресурс, включающий лицензию на 1С-Битрикс «Стандарт», технологию «Композитный сайт».

Лендинг от 25 000 руб., срок от 2 недель

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