Дата и время

Bitrix Framework работает с датой и временем с помощью двух классов:

  • Bitrix\Main\Type\Date — для даты,

  • Bitrix\Main\Type\DateTime — для даты и времени.

use Bitrix\Main\Type\Date;
        use Bitrix\Main\Type\DateTime;
        
        $date = new Date('25.11.2025', 'd.m.Y');
        $datetime = new DateTime('25.11.2025 14:30:00', 'd.m.Y H:i:s');
        
        echo $date->format('d.m.Y H:i:s');  // 25.11.2025 00:00:00
        echo $datetime->format('d.m.Y H:i:s'); // 25.11.2025 14:30:00
        

Классы основаны на стандартном PHP-классе \DateTime, но учитывают региональные настройки и часовой пояс продукта Битрикс.

Формат вывода

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

Региональные настройки хранит объект Bitrix\Main\Context\Culture. Классы получают эти настройки через \Bitrix\Main\Context::getCurrent()->getCulture().

  • Culture::getDateFormat() — возвращает формат короткой даты, например, DD.MM.YYYY.

  • Culture::getDateTimeFormat() — возвращает формат даты и времени.

Классы Date и DateTime используют эти методы, чтобы показывать дату в привычном для пользователя виде.

Преобразование формата

Классы используют метод convertFormatToPhp, чтобы преобразовать региональные настройки в формат PHP.

Маска в настройках Маска PHP Описание
YYYY Y Год
MMMM F Полное название месяца
MM m Месяц с ведущим нулем
DD d День с ведущим нулем
TT / T A / a AM / PM
MI i Минуты
SS s Секунды
HH H Час в 24-часовом формате
H G Час без ведущего нуля
GG h Час в 12-часовом формате
G g Час в 12-часовом формате без нуля

Класс Date

Класс Bitrix\Main\Type\Date хранит только дату. Такой формат подходит для даты рождения, сроков акций или других событий без указания времени.

Создать объект даты

Конструктор new Date($time, $format) создает объект даты. Примеры:

  • new Date() — текущая дата сервера.

  • new Date('25.12.2023') — дата из строки. Класс автоматически использует формат из настроек сайта, например, DD.MM.YYYY.

  • new Date('2023-12-25', 'YYYY-MM-DD') — дата из строки с указанным форматом.

Если строка имеет неверный формат, конструктор выбрасывает исключение Main\ObjectException.

После создания система устанавливает объекту время 00:00:00.

Создать дату из объекта

Класс Date предоставляет именованные конструкторы для создания объектов из разных источников.

  • createFromPhp(\DateTime $datetime) — создает объект Date из объекта \DateTime. Время сбрасывает в 00:00:00.

    use Bitrix\Main\Type\Date;
            
            $phpDate = new \DateTime('2025-11-25 14:30:00');
            $date = Date::createFromPhp($phpDate); // 2025-11-25 00:00:00
            
  • createFromTimestamp($timestamp) — создает объект Date из метки времени.

    use Bitrix\Main\Type\Date;
            
            $timestamp = strtotime('2025-11-25');
            $date = Date::createFromTimestamp($timestamp);
            
  • createFromText($text) — создает объект Date из текста. Вернет null, если не сможет распарсить текст. Метод учитывает текущий язык сайта и понимает фразы на этом языке, например, tomorrow или сегодня вечером.

    use Bitrix\Main\Type\Date;
            
            $date = Date::createFromText('end of next week');
            if ($date === null)
            {
                // Не удалось разобрать текст
            }
            

Методы

Форматировать дату

Метод format($format) форматирует дату по маске PHP.

  • $format — строка формата PHP.
use Bitrix\Main\Type\Date;
        
        $date = new Date('2025-11-25', 'Y-m-d');
        echo $date->format('d.m.Y'); // 25.11.2025
        

Преобразовать в строку

Метод toString() преобразует строку в дату с учетом региональных настроек сайта.

use Bitrix\Main\Type\Date;
        
        $date = new Date('2025-11-25', 'Y-m-d');
        echo $date; // 25.11.2025 при формате сайта DD.MM.YYYY
        

Подробнее о региональных настройках в статье Локализация

Изменить дату на интервал

Метод add($interval) изменяет дату на заданный интервал. Вызов метода изменяет и возвращает этот же объект.

  • $interval — строка интервала. Указать смещение можно словами years, months, days, weeks, hours, minutes, seconds со знаками +/- или в формате DateInterval.
use Bitrix\Main\Type\Date;
        
        // Добавить 10 дней в формате DateInterval
        $date1 = new Date('01.02.2025', 'd.m.Y');
        $date1->add('P10D');
        echo $date1; // 11.02.2025
        
        // Вычесть 1 месяц в формате DateInterval
        $date2 = new Date('01.02.2025', 'd.m.Y');
        $date2->add('-P1M');
        echo $date2; // 01.01.2025
        
        // Добавить 5 дней в текстовом формате
        $date3 = new Date('01.02.2025', 'd.m.Y');
        $date3->add('+5 days');
        echo $date3; // 06.02.2025
        

Установить дату

Метод setDate($year, $month, $day) устанавливает новую дату.

  • $year — год.

  • $month — месяц.

  • $day — день.

use Bitrix\Main\Type\Date;
        
        $date = new Date();
        $date->setDate(2025, 5, 1);
        echo $date; // 01.05.2025
        

Получить метку времени timestamp

Метод getTimestamp() возвращает метку времени timestamp для даты.

use Bitrix\Main\Type\Date;
        
        $date = new Date('2025-11-25', 'Y-m-d');
        echo $date->getTimestamp(); // 1742947200
        

Получить интервал между датами

Метод getDiff(Date $time) возвращает интервал \DateInterval между двумя датами.

use Bitrix\Main\Type\Date;
        
        $d1 = new Date('2025-01-01', 'Y-m-d');
        $d2 = new Date('2025-01-10', 'Y-m-d');
        $diff = $d2->getDiff($d1);
        echo $diff->days; // 9
        

Проверить строку

Метод isCorrect($time, $format = null) проверяет строку. Возвращает true, если строка содержит корректную дату.

use Bitrix\Main\Type\Date;
        
        if (Date::isCorrect('31.02.2025', 'd.m.Y'))
        {
            // Код не выполнится, так как дата неверна
        }
        

Класс DateTime

Класс Bitrix\Main\Type\DateTime расширяет Date — добавляет работу со временем и часовыми поясами.

Создать объект даты и времени

Конструктор создает объект даты со временем.

new DateTime(?string $time = null, ?string $format = null, ?DateTimeZone $timezone = null) 
        
  • $time — строка с датой и временем. По умолчанию — текущее время.

  • $format — формат для разбора строки. Если не передать формат, метод использует текущий региональный формат из настроек сайта.

  • $timezone — часовой пояс. По умолчанию использует пояс сервера.

Примеры:

use Bitrix\Main\Type\DateTime;
        
        // Текущее время
        $dt1 = new DateTime();
        
        // Время из строки
        $dt2 = new DateTime('2025-11-25 14:30:15', 'Y-m-d H:i:s');
        
        // Время из строки с указанием часового пояса
        $dt3 = new DateTime('2025-11-25 14:30:15+03:00', \DateTime::ATOM);
        

Создать дату и время из объекта

Класс DateTime предоставляет именованные конструкторы для создания объектов из разных источников.

  • createFromPhp(\DateTime $datetime) — создает объект DateTime из стандартного объекта PHP \DateTime.

    use Bitrix\Main\Type\DateTime;
            
            $phpDt = new \DateTime('2025-11-25 14:30:00', new \DateTimeZone('UTC'));
            $dt = DateTime::createFromPhp($phpDt);
            
  • createFromTimestamp($timestamp) — создает объект DateTime из метки времени timestamp. Метод берет часовой пояс из настроек PHP.

    use Bitrix\Main\Type\DateTime;
            
            $dt = DateTime::createFromTimestamp(time());
            
  • tryParse($timeString, $format = null) — пытается создать объект DateTime из строки. В отличие от конструктора, метод не выбрасывает исключение. Он возвращает объект DateTime или null.

    use Bitrix\Main\Type\DateTime;
            
            $dt = DateTime::tryParse($request['DATE'], 'd.m.Y H:i');
            if ($dt === null)
            {
                // Строка имеет неверный формат
            }
            

Методы

Класс DateTime наследует методы класса Date и добавляет свои.

Задать время

Метод setTime($hour, $minute, $second = 0, $microseconds = 0) задает время.

use Bitrix\Main\Type\DateTime;
        
        $dt = new DateTime('2025-11-25', 'Y-m-d');
        $dt->setTime(9, 30);
        echo $dt->format('d.m.Y H:i'); // 25.11.2025 09:30
        

Управлять часовыми поясами объекта

  • getTimeZone() — возвращает текущий часовой пояс объекта.

  • setTimeZone(\DateTimeZone $timezone) — устанавливает новый часовой пояс.

    use Bitrix\Main\Type\DateTime;
            
            $dt = new DateTime('2025-11-25 12:00:00', 'Y-m-d H:i:s');
            $dt->setTimeZone(new \DateTimeZone('Europe/Berlin'));
            
  • setDefaultTimeZone() — сбрасывает часовой пояс на пояс сервера по умолчанию.

Работа с часовыми поясами пользователя

Система хранит время в часовом поясе сервера. Пользователь видит время с учетом его локального часового пояса.

Настройка

Настроить часовые пояса можно в административном разделе на странице Настройки > Настройки продукта > Настройки модулей > Главный модуль.

  • Локальное время сервера — показывает время, дату и часовой пояс сервера.

  • Разрешить использование часовых поясов — включает поддержку часовых поясов в продукте. После включения класс CTimeZone определяет отличие времени пользователя от времени сервера.

  • Часовой пояс сервера по умолчанию — устанавливает часовой пояс сервера. Можно оставить локальное время сервера или выбрать вручную.

  • По умолчанию автоматически определять часовой пояс по браузеру — определяет часовой пояс пользователя через браузер Intl.DateTimeFormat и сохраняет его в cookies. Пользователь также может указать свой часовой пояс в профиле, в этом случае система будет использовать значение из профиля.

Методы конвертации времени

В классе DateTime есть два метода для конвертации времени в нужный часовой пояс.

  • createFromUserTime($timeString) — создает объект Даты и времени в часовом поясе сервера из строки с датой и временем в часовом поясе пользователя.
use Bitrix\Main\Type\DateTime;
        
        // Пользователь из Москвы (UTC+3) вводит своё текущее время - "25.11.2025 18:00"
        $serverTime = DateTime::createFromUserTime('25.11.2025 18:00');
        
        // Сервер в Лондоне (UTC+0). Там сейчас 15:00
        $serverTime->format('H:i'); // "15:00"
        
  • toUserTime() — изменяет время текущего объекта на часового пояса пользователя.
use Bitrix\Main\Type\DateTime;
        
        // Сервер в Лондоне (UTC+0)
        $serverTime = new DateTime('2025-11-25 12:00:00', 'Y-m-d H:i:s');
        
        // Пользователь в Москве (UTC+3)
        echo $serverTime->toUserTime()->format('H:i'); // "15:00"
        

Автоматический перевод времени

Класс DateTime автоматически переводит время в часовой пояс пользователя при преобразовании объекта в строку, если в настройках сайта включены часовые пояса.

use Bitrix\Main\Type\DateTime;
        
        // Сервер в Лондоне (UTC+0)
        $date = new DateTime('2025-11-25 12:00:00', 'Y-m-d H:i:s');
        
        // Пользователь в Москве (UTC+3)
        echo $date; // Автоматически выведет "25.11.2025 15:00:00"
        

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

use Bitrix\Main\Type\DateTime;
        
        $dt = $row['TIMESTAMP_X'];
        $dt->disableUserTime();
        echo $dt; // Выведет серверное время
        

Чтобы снова включить перевод, используйте метод enableUserTime(). Проверить текущее состояние можно методом isUserTimeEnabled().