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 При передаче строки с недопустимой датой и временем функция теперь выбрасывает исключение DateMalformedStringException вместо исключения Exception.
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
Добавить

Примечания пользователей 2 notes

up
3
Dmitrii
2 years 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").
up
0
theking2 at king dot ma
1 day ago
Working on a (REST) interface between JavaScript and a database needs to take care of the problem of the time zone info. In JavaScript JSON.stringify() will convert all dates to UTC. Makes sense. If we receive and decode this on in the PHP realm we should explicitly say so and altought null indicates the configured locale timezone although I do believe that more often than not no timezone is configured in PHP. So better be save than sorry and prevent you to miss your flight:

<?php
$jsonString
= '{ "date": "2025-05-04T11:58:37.848Z" }';
$dateString = json_decode($jsonString, true)['date']; // will contain the date in UTC (Zulu) tz

$d = new \DateTimeImmutable($dateString, new \DateTimeZone('UTC')); // interpreted as such

$databaseZone = new \DateTimeZone("Europe/Zurich");
$d = $d->setTimeZone( $databaseZone ); // but our server is somewhere else

var_dump($d);

// Now we can store the date in our local database, which is blissfully unaware of timezones

?>
To Top