Date timezone get: примеры (PHP)
date_timezone_get(DateTimeInterface $object): DateTimeZone|falseФункция 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
)Функция date_default_timezone_get() возвращает часовой пояс, установленный по умолчанию для всех функций даты/времени в скрипте. Она не требует аргументов. Используется, когда нужно узнать текущую настройку временной зоны скрипта.
Метод 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 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
Код позволяет сравнить, находятся ли две даты в одном часовом поясе:
$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 = 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
Объединяя с методом getOffset(), можно вычислить смещение временной зоны объекта в секундах:
$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