Gmmktime: примеры (PHP)
gmmktime(int $hour, ?int $minute = null, ?int $second = null, ?int $month = null, ?int $day = null, ?int $year = null): int|falseФункция gmmktime() возвращает Unix-временную метку для даты по Гринвичу (GMT/UTC). Это аналог mktime(), но аргументы интерпретируются как время по Гринвичу, а не по локальному часовому поясу сервера.
Функция применяется при необходимости получить временную метку для GMT/UTC времени, независимо от настроек сервера. Это полезно для:
- Хранения дат в базе данных в универсальном формате.
- Сравнения временных интервалов между разными часовыми поясами.
- Создания приложений с глобальной аудиторией.
Все параметры необязательны. Если аргумент не указан или равен null, используется текущее GMT-значение.
gmmktime(
?int $hour = null,
?int $minute = null,
?int $second = null,
?int $month = null,
?int $day = null,
?int $year = null
): int|false- $hour - Часы (0-23).
- $minute - Минуты (0-59).
- $second - Секунды (0-59).
- $month - Месяц (1-12).
- $day - День месяца (1-31).
- $year - Год, обычно 4-значный. До PHP 8.0 значение 0-69 интерпретировалось как 2000-2069, а 70-100 как 1970-2000.
Функция возвращает Unix-временную метку (количество секунд с 1 января 1970 года 00:00:00 GMT) или false в случае ошибки (например, для несуществующей даты).
<?php
echo gmmktime(); // Выводит текущую Unix-метку для GMT
?>Например: 1698765432
<?php
// 25 декабря 2023 года, 15:30:00 GMT
$timestamp = gmmktime(15, 30, 0, 12, 25, 2023);
echo $timestamp;
echo '\n';
echo date('Y-m-d H:i:s', $timestamp); // Преобразуем к читаемому формату
?>1703511000 2023-12-25 15:30:00
<?php
// Только час и минуты, остальное - текущие значения GMT
$timestamp = gmmktime(14, 45);
echo date('Y-m-d H:i:s', $timestamp);
?>Выведет что-то вроде: 2024-10-31 14:45:00 (зависит от момента вызова)
Для работы со временем в PHP существует несколько альтернатив.
Аналогична gmmktime(), но интерпретирует аргументы как локальное время сервера. Выбор зависит от требуемого часового пояса.
<?php
date_default_timezone_set('Europe/Moscow');
$gmt = gmmktime(12, 0, 0); // 12:00 GMT
$local = mktime(12, 0, 0); // 12:00 Москва
// Разница в секундах равна смещению часового пояса
echo $local - $gmt; // Например, 10800 (3 часа)
?>Объектно-ориентированный интерфейс, предпочтительный с PHP 5.2. Позволяет удобно манипулировать датами и временем, работать с часовыми поясами.
<?php
$date = new DateTime('2023-12-25 15:30:00', new DateTimeZone('UTC'));
$timestamp = $date->getTimestamp(); // Аналог gmmktime
?>Преобразует текстовое представление даты в Unix-метку. Может учитывать часовой пояс, если строка содержит информацию о нем.
<?php
$timestamp = strtotime('25 December 2023 15:30 GMT');
?>Рекомендации: Для новых проектов лучше использовать классы DateTime/DateTimeImmutable из-за их гибкости и безопасности. Функция gmmktime полезна для простых сценариев или поддержки старого кода.
Функция пытается скорректировать недопустимые даты, что может привести к неожиданным результатам.
<?php
// 31 февраля - не существует
$ts = gmmktime(0, 0, 0, 2, 31, 2023);
echo date('Y-m-d', $ts); // Автоматическая корректировка
?>2023-03-03
Смешивание gmmktime (GMT) и функций для локального времени без учета поправки.
<?php
date_default_timezone_set('Asia/Yekaterinburg'); // UTC+5
$gmt_noon = gmmktime(12, 0, 0); // 12:00 GMT
$local_noon = mktime(12, 0, 0); // 12:00 Екатеринбург (UTC+5)
echo 'Разница: ' . ($local_noon - $gmt_noon) . ' сек';
?>Разница: 18000 сек (5 часов)
<?php
// В PHP 7:
$ts = gmmktime(0,0,0,1,1,70); // Год 70
// В PHP 8 это 70 год н.э.
?>Изменена логика интерпретации двухзначных годов. Ранее значения 0-69 преобразовывались в 2000-2069, а 70-100 в 1970-2000. С PHP 8.0 год 70 теперь означает 70 год нашей эры.
<?php
// PHP 7:
// gmmktime(0,0,0,1,1,70) возвращает метку для 1970-01-01
// PHP 8:
// gmmktime(0,0,0,1,1,70) возвращает метку для 0070-01-01
?>Включена поддержка null для всех аргументов. Ранее аргументы можно было опускать только с конца. Это делает код более читаемым.
<?php
// Теперь допустимо:
$ts = gmmktime(hour: 14, month: 5, day: 10);
?><?php
// Момент новогоднего обращения президента по Москве (MSK, UTC+3)
$msk_hour = 23; $msk_min = 55;
$gmt_hour = $msk_hour - 3; // Переводим в GMT
$new_year_gmt = gmmktime($gmt_hour, $msk_min, 0, 12, 31, 2023);
echo 'По Гринвичу: ' . date('Y-m-d H:i:s', $new_year_gmt);
echo '\n';
echo 'По Москве: ' . date('Y-m-d H:i:s T', $new_year_gmt + 3*3600);
?>По Гринвичу: 2023-12-31 20:55:00 По Москве: 2023-12-31 23:55:00 MSK
<?php
// 29 февраля 2024 года (високосный год) - существует
$ts = gmmktime(0, 0, 0, 2, 29, 2024);
echo date('Y-m-d', $ts);
// 29 февраля 2023 года - будет скорректировано
$ts2 = gmmktime(0, 0, 0, 2, 29, 2023);
echo '\n' . date('Y-m-d', $ts2);
?>2024-02-29 2023-03-01
<?php
$start = gmmktime(0, 0, 0, 6, 1, 2023);
$end = gmmktime(0, 0, 0, 6, 15, 2023);
$diff_days = ($end - $start) / (60*60*24);
echo "Дней между датами: $diff_days";
?>Дней между датами: 14
<?php
$base = gmmktime(0, 0, 0, 1, 1, 2023);
for ($i = 0; $i < 5; $i++) {
$ts = $base + ($i * 7 * 24 * 3600); // Прибавляем недели
echo date('Y-m-d (l)', $ts) . "\n";
}
?>2023-01-01 (Sunday) 2023-01-08 (Sunday) 2023-01-15 (Sunday) 2023-01-22 (Sunday) 2023-01-25 (Sunday)
Можно получить метки для дат до 1970 года (на 32-битных системах ограничено 1901-2038 годом).
<?php
// Первый полет человека в космос, 12 апреля 1961 года, 06:07 GMT
$ts = gmmktime(6, 7, 0, 4, 12, 1961);
echo $ts . "\n";
echo date('Y-m-d H:i:s', $ts);
?>-275328780 1961-04-12 06:07:00
Gmmktime в Python
Модуль time или calendar.
import time, calendar
# time.gmtime() возвращает struct_time, time.mktime() - локальное время
# Аналог gmmktime(2023, 12, 25, 15, 30, 0):
struct_time = (2023, 12, 25, 15, 30, 0, 0, 0, 0)
timestamp = calendar.timegm(struct_time)
print(timestamp) # 1703511000Gmmktime в Javascript
Метод Date.UTC() возвращает количество миллисекунд с эпохи для UTC.
// Аналог gmmktime(2023, 12, 25, 15, 30, 0)
// Месяцы в JS: 0-11 (декабрь - 11)
let ms = Date.UTC(2023, 11, 25, 15, 30, 0);
let timestamp = Math.floor(ms / 1000); // Перевод в секунды
console.log(timestamp); // 1703511000Gmmktime в MySQL
Функция UNIX_TIMESTAMP() с указанием даты в UTC.
SELECT UNIX_TIMESTAMP('2023-12-25 15:30:00');
-- Возвращает Unix-время, интерпретируя строку как UTC-время в сессии с time_zone='+00:00'Ключевое отличие PHP-функции gmmktime заключается в том, что она принимает отдельные числовые компоненты, в то время как аналоги часто работают с готовыми датами или объектами.