Date timezone get: примеры (PHP)

Примеры применения функции date_timezone_get в PHP
Раздел: Дата и время
date_timezone_get(DateTimeInterface $object): DateTimeZone|false
Описание функции date_timezone_get

Функция date_timezone_get() в PHP предназначена для получения временной зоны, связанной с заданным объектом DateTimeInterface. Эта функция используется, когда требуется определить, в каком часовом поясе находится объект даты и времени. Это полезно для операций конвертации времени между часовыми поясами или для логирования временных меток с учетом зоны.

Функция принимает один обязательный аргумент:

  • object – объект класса DateTimeInterface (например, экземпляр DateTime или DateTimeImmutable).

Возвращаемое значение – объект DateTimeZone, представляющий часовой пояс, или false в случае ошибки.

Краткие примеры использования

Пример с созданием объекта DateTime и получением его часового пояса:

$date = new DateTime('now', new DateTimeZone('Europe/Moscow'));
$timezone = date_timezone_get($date);
echo $timezone->getName();
Europe/Moscow

Пример с объектом DateTimeImmutable:

$date = new DateTimeImmutable('2023-12-31', new DateTimeZone('America/New_York'));
$timezone = date_timezone_get($date);
print_r($timezone);
DateTimeZone Object
(
    [timezone_type] => 3
    [timezone] => America/New_York
)
Похожие функции в PHP

Функция date_default_timezone_get() возвращает часовой пояс, установленный по умолчанию для всех функций даты/времени в скрипте. Она не требует аргументов. Используется, когда нужно узнать текущую настройку временной зоны скрипта.

DateTime::getTimezone

Метод DateTime::getTimezone() является объектно-ориентированной альтернативой для date_timezone_get(). Он выполняет ту же задачу, но вызывается как метод объекта. Предпочтительнее использовать в объектно-ориентированном коде.

$date = new DateTime('now', new DateTimeZone('Asia/Tokyo'));
$timezone = $date->getTimezone();
echo $timezone->getName();
Asia/Tokyo
Аналоги в других языках

Date timezone get в Python

В Python объект datetime может иметь атрибут tzinfo. Для получения часового пояса используется свойство tzinfo. В отличие от PHP, где возвращается объект DateTimeZone, в Python возвращается объект, реализующий интерфейс tzinfo.

from datetime import datetime
import pytz

tz = pytz.timezone('Europe/London')
dt = datetime.now(tz)
print(dt.tzinfo)
Europe/London

Date timezone get в Javascript

В JavaScript объект Date не содержит информации о часовом поясе в явном виде. Для получения смещения от UTC используется метод getTimezoneOffset(). Для работы с названиями временных зон используются библиотеки, такие как Intl.

const date = new Date();
console.log(date.getTimezoneOffset());
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
-180
Europe/Moscow

Date timezone get в MySQL

В MySQL для получения временной зоны сессии используется системная переменная @@session.time_zone. Она возвращает строку с названием зоны или смещением.

SELECT @@session.time_zone;
SYSTEM
Типичные ошибки

Ошибка при передаче неподходящего типа аргумента:

$result = date_timezone_get('not an object');
var_dump($result);
Warning: date_timezone_get() expects parameter 1 to be DateTimeInterface, string given in ...
bool(false)

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

$date = date_create('now');
$timezone = date_timezone_get($date);
echo $timezone->getName();
Возвратит временную зону по умолчанию, например, Europe/Berlin
Изменения в последних версиях PHP

В PHP 8.0 функция стала строго типизированной. Аргумент теперь должен быть типа DateTimeInterface. Передача несовместимого типа вызывает TypeError. В предыдущих версиях такое поведение приводило к предупреждению и возврату false.

Пример для PHP 8:

try {
    date_timezone_get('invalid');
} catch (TypeError $e) {
    echo $e->getMessage();
}
date_timezone_get(): Argument #1 ($object) must be of type DateTimeInterface, string given
Расширенные примеры
Сравнение временных зон двух объектов

Код позволяет сравнить, находятся ли две даты в одном часовом поясе:

Пример php
$date1 = new DateTime('now', new DateTimeZone('UTC'));
$date2 = new DateTime('now', new DateTimeZone('Europe/Moscow'));
$tz1 = date_timezone_get($date1);
$tz2 = date_timezone_get($date2);
if ($tz1->getName() === $tz2->getName()) {
    echo 'Часовые пояса одинаковые.';
} else {
    echo 'Часовые пояса разные: ' . $tz1->getName() . ' и ' . $tz2->getName();
}
Часовые пояса разные: UTC и Europe/Moscow
Использование с date_create и изменение зоны

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

Пример php
$date = date_create('2024-01-15 12:00:00', timezone_open('Australia/Sydney'));
$timezone = date_timezone_get($date);
echo 'Исходная зона: ' . $timezone->getName() . "\n";
date_timezone_set($date, timezone_open('Pacific/Auckland'));
$newTimezone = date_timezone_get($date);
echo 'Новая зона: ' . $newTimezone->getName();
Исходная зона: Australia/Sydney
Новая зона: Pacific/Auckland
Получение смещения от UTC

Объединяя с методом getOffset(), можно вычислить смещение временной зоны объекта в секундах:

Пример php
$date = new DateTime('now', new DateTimeZone('America/Los_Angeles'));
$timezone = date_timezone_get($date);
$offset = $timezone->getOffset($date);
echo 'Смещение от UTC в секундах: ' . $offset . "\n";
echo 'Смещение в часах: ' . ($offset / 3600);
Смещение от UTC в секундах: -25200
Смещение в часах: -7

PHP date_timezone_get function comments

En
Date timezone get Alias of DateTime::getTimezone