Gmdate: примеры (PHP)

Форматирование даты по UTC: возможности gmdate
Раздел: Дата и время
gmdate(string $format, ?int $timestamp = null): string

Функция gmdate

Функция gmdate в PHP форматирует временную метку Unix в строку даты/времени в соответствии с указанным форматом. Она работает идентично функции date(), но возвращает время по Гринвичу (GMT/UTC), а не локальное время сервера.

Аргументы функции
  • format (обязательный, строка) - Строка формата, определяющая, как будет представлена дата и время. Использует те же спецификаторы, что и date() (например, 'Y-m-d H:i:s').
  • timestamp (необязательный, int) - Временная метка Unix. Если аргумент не указан или равен null, используется текущее время (time()). В PHP 8.0 поведение при null изменилось - теперь используется текущее время, а не ошибка.

Простые примеры

Базовое использование

Получение текущей даты и времени по UTC.

<?
echo gmdate('Y-m-d H:i:s');
?>
2023-10-27 14:30:15
С указанием временной метки
<?
$timestamp = 1698417000;
echo gmdate('l, F j, Y, g:i a', $timestamp);
?>
Thursday, October 27, 2023, 2:30 pm
Различные форматы
<?
echo gmdate('D, d M y H:i:s T') . "\n";
echo gmdate('c') . "\n"; // ISO 8601
echo gmdate('r'); // RFC 2822
?>
Thu, 27 Oct 23 14:30:15 GMT
2023-10-27T14:30:15+00:00
Thu, 27 Oct 2023 14:30:15 +0000

Похожие функции в PHP

Функция date() идентична по синтаксису, но возвращает время в локальной временной зоне сервера. Предпочтительна для отображения времени пользователю в его локальном контексте.

Возвращает целое число для одного поля даты/времени. Более эффективна, когда требуется только один компонент.

DateTimeImmutable

Объектно-ориентированный подход с классом DateTimeImmutable и методом format() предоставляет более гибкое и безопасное управление датами и временем, включая работу с часовыми поясами.

<?
$date = new DateTimeImmutable('now', new DateTimeZone('UTC'));
echo $date->format('Y-m-d H:i:s');
?>
2023-10-27 14:30:15

Типичные ошибки

Путаница с локальным временем

Ожидание локального времени при использовании gmdate.

<?
date_default_timezone_set('Europe/Moscow');
echo 'Local: ' . date('H:i') . "\n";
echo 'UTC:   ' . gmdate('H:i') . "\n";
?>
Local: 17:30
UTC:   14:30
Некорректный формат для микросекунд

Функция gmdate не поддерживает микросекунды. Для них необходимо использовать DateTime.

<?
// Не работает
echo gmdate('u');
?>
000000
Использование устаревших спецификаторов

Спецификатор 'e' (временная зона) всегда возвращает 'UTC' или 'GMT'.

<?
echo gmdate('e');
?>
UTC

Изменения в PHP

PHP 8.0.0

Параметр timestamp теперь принимает значение null, что приводит к использованию текущего времени. Ранее это вызывало предупреждение.

<?
// Работает без ошибок в PHP >= 8.0
echo gmdate('Y', null);
?>
2023
PHP 7.0.0

Были добавлены константы для форматов RFC 7231 (DATE_RFC7231) и ISO 8601 с миллисекундами (DATE_ISO8601_EXPANDED).

Расширенные примеры

Генерация временных меток для графика

Создание меток времени для оси X графика с интервалом в час.

Пример php
<?
$start = 1698417000; // Начальная метка
for ($i = 0; $i < 24; $i++) {
    echo gmdate('H:00', $start + ($i * 3600)) . "\n";
}
?>
14:00
15:00
...
13:00
Форматирование для специфических протоколов

HTTP-заголовки, такие как Last-Modified, требуют формата RFC 1123.

Пример php
<?
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $filemtime) . ' GMT');
?>
Сравнение временных зон

Вывод одного момента времени в разных зонах.

Пример php
<?
$ts = time();
echo 'UTC:       ' . gmdate('Y-m-d H:i:s', $ts) . "\n";
echo 'Local:     ' . date('Y-m-d H:i:s', $ts) . "\n";
echo 'New York:  ' . date('Y-m-d H:i:s', $ts - 5*3600) . "\n"; // Упрощенно
?>
UTC:       2023-10-27 14:30:15
Local:     2023-10-27 17:30:15
New York:  2023-10-27 09:30:15
Работа с неделями года
Пример php
<?
echo 'Текущая неделя года по UTC: ' . gmdate('W');
?>
Текущая неделя года по UTC: 43
Преобразование в юлианский день
Пример php
<?
$jd = gregoriantojd((int)gmdate('m'), (int)gmdate('d'), (int)gmdate('Y'));
echo 'Юлианский день: ' . $jd;
?>
Юлианский день: 2460252

Аналоги в других языках

Python (datetime.utcnow)
from datetime import datetime
print(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'))
2023-10-27 14:30:15
JavaScript (Date.toUTCString)
const now = new Date();
console.log(now.toUTCString());
// Или с Intl.DateTimeFormat
console.log(new Intl.DateTimeFormat('en-GB', { timeZone: 'UTC' }).format(now));
Thu, 27 Oct 2023 14:30:15 GMT
27/10/2023
MySQL (UTC_TIMESTAMP)
SELECT UTC_TIMESTAMP, DATE_FORMAT(UTC_TIMESTAMP, '%Y-%m-%d %H:%i:%s');
2023-10-27 14:30:15 | 2023-10-27 14:30:15

PHP gmdate function comments

En
Gmdate Format a GMT/UTC date/time