PHPCon Poland 2024

DateTimeImmutable::__construct

date_create_immutable

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

DateTimeImmutable::__construct -- date_create_immutableВозвращает новый объект DateTimeImmutable

Описание

Объектно-ориентированный стиль

public DateTimeImmutable::__construct(string $datetime = "now", ?DateTimeZone $timezone = null)

Процедурный стиль

Возвращает новый объект DateTimeImmutable.

Список параметров

datetime

Строка даты и времени. Объяснение корректных форматов дано в разделе Форматы даты и времени.

Для получения текущего времени в параметр timezone можно передать строку "now".

timezone

Объект DateTimeZone, представляющий часовой пояс параметра datetime.

Если параметр timezone опущен или равен null, будет использован текущий часовой пояс.

Замечание:

Параметр timezone и текущий часовой пояс будут проигнорированы, если параметр datetime либо является временной меткой UNIX (например, @946684800), либо указан часовой пояс (например, 2010-01-28T15:00:00+02:00 или 2010-07-05T06:00:00Z).

Возвращаемые значения

Возвращает новый экземпляр DateTimeImmutable.

Ошибки

Если будет передана строка с неправильной датой/временем, будет выброшено исключение DateMalformedStringException. До PHP 8.3 выбрасывалось исключение Exception.

Список изменений

Версия Описание
8.3.0 Теперь вместо исключения Exception выбрасывается исключение DateMalformedStringException, если передана неверная строка.
7.1.0 Отныне микросекунды заполняются фактическим значением. Не '00000'.

Примеры

Пример #1 Пример использования DateTimeImmutable::__construct()

Объектно-ориентированный стиль

<?php
try {
$date = new DateTimeImmutable('2000-01-01');
} catch (
Exception $e) {
echo
$e->getMessage();
exit(
1);
}

echo
$date->format('Y-m-d');
?>

Процедурный стиль

<?php
$date
= date_create('2000-01-01');
if (!
$date) {
$e = date_get_last_errors();
foreach (
$e['errors'] as $error) {
echo
"$error\n";
}
exit(
1);
}

echo
date_format($date, 'Y-m-d');
?>

Результат выполнения приведённых примеров:

2000-01-01

Пример #2 Тонкости DateTimeImmutable::__construct()

<?php
// Указанная дата/время в часовом поясе вашего компьютера.
$date = new DateTimeImmutable('2000-01-01');
echo
$date->format('Y-m-d H:i:sP') . "\n";

// Указанная дата/время в указанном часовом поясе.
$date = new DateTimeImmutable('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo
$date->format('Y-m-d H:i:sP') . "\n";

// Текущая дата/время в часовом поясе вашего компьютера.
$date = new DateTimeImmutable();
echo
$date->format('Y-m-d H:i:sP') . "\n";

// Текущая дата/время в указанном часовом поясе.
$date = new DateTimeImmutable('now', new DateTimeZone('Pacific/Nauru'));
echo
$date->format('Y-m-d H:i:sP') . "\n";

// Использование временной метки UNIX. Обратите внимание, что результат в часовом поясе UTC.
$date = new DateTimeImmutable('@946684800');
echo
$date->format('Y-m-d H:i:sP') . "\n";

// Несуществующие значения переворачиваются.
$date = new DateTimeImmutable('2000-02-30');
echo
$date->format('Y-m-d H:i:sP') . "\n";
?>

Вывод приведённого примера будет похож на:

2000-01-01 00:00:00-05:00
2000-01-01 00:00:00+12:00
2010-04-24 10:24:16-04:00
2010-04-25 02:24:16+12:00
2000-01-01 00:00:00+00:00
2000-03-01 00:00:00-05:00

Пример #3 Изменение связанного часового пояса

<?php
$timeZone
= new \DateTimeZone('Asia/Tokyo');

$time = new \DateTimeImmutable();
$time = $time->setTimezone($timeZone);

echo
$time->format('Y/m/d H:i:s'), "\n";
?>

Вывод приведённого примера будет похож на:

2022/08/12 23:49:23

Пример #4 Использование относительной строки даты/времени

<?php
$time
= new \DateTimeImmutable("-1 year");

echo
$time->format('Y/m/d H:i:s'), "\n";
?>

Вывод приведённого примера будет похож на:

2021/08/12 15:43:51
add a note

User Contributed Notes 1 note

up
1
Dmitrii
1 year ago
"If $timezone is omitted or null, the current timezone will be used." - note, that timezone IS NOT equal offset, if its important for your application.

If default timezone = Europe/Moscow, then:
echo (new \DateTimeImmutable('2014-10'))->format(DATE_ATOM); // gives "2014-10-01T00:00:00+04:00"
echo (new \DateTimeImmutable('2014-11'))->format(DATE_ATOM); // gives "2014-11-01T00:00:00+03:00"
because of law changes (abolition of "summer time").
To Top