Localtime: примеры (PHP)
localtime(?int $timestamp = null, bool $associative = false): arrayФункция localtime() возвращает информацию о локальном времени в виде индексированного или ассоциативного массива. Она часто применяется для получения структурированных данных о времени без использования объектов DateTime, особенно в устаревшем коде.
- timestamp (необязательный) - Метка времени Unix. Если не указана или равна null, используется текущее время (time()).
- associative (необязательный) - Логический флаг, определяющий тип возвращаемого массива. При значении false (по умолчанию) возвращается индексированный массив. При true - ассоциативный.
<?php
$timeArray = localtime();
print_r($timeArray);
?>Array
(
[0] => 43 // секунды
[1] => 59 // минуты
[2] => 18 // часы
[3] => 11 // день месяца
[4] => 7 // месяц (0-11)
[5] => 124 // год с 1900
[6] => 1 // день недели (0-6)
[7] => 221 // день года
[8] => 0 // флаг летнего времени
)<?php
$timeArray = localtime(time(), true);
print_r($timeArray);
?>Array
(
[tm_sec] => 43
[tm_min] => 59
[tm_hour] => 18
[tm_mday] => 11
[tm_mon] => 7
[tm_year] => 124
[tm_wday] => 1
[tm_yday] => 221
[tm_isdst] => 0
)<?php
$timestamp = mktime(12, 0, 0, 8, 15, 2023);
print_r(localtime($timestamp, true));
?>Array
(
[tm_sec] => 0
[tm_min] => 0
[tm_hour] => 12
[tm_mday] => 15
[tm_mon] => 7
[tm_year] => 123
[tm_wday] => 2
[tm_yday] => 226
[tm_isdst] => 1
)- getdate() - Возвращает ассоциативный массив с более понятными ключами (например, 'minutes', 'month'). Более удобна для чтения, так как значения месяца и дня недели представлены в привычном формате (1-12, 1-7).
- date() - Форматирует вывод времени в строку. Применяется, когда требуется строка определенного формата, а не массив данных.
- DateTime - Объектно-ориентированный подход. Класс DateTime и его методы предоставляют наиболее гибкие и мощные инструменты для работы со временем, включая временные зоны.
Функцию localtime целесообразно использовать при необходимости совместимости с кодом на языке C или в системах, где требуется именно структура tm. В современном PHP предпочтительнее применять getdate() или объекты DateTime.
<?php
$time = localtime(time(), true);
echo 'Текущий месяц: ' . ($time['tm_mon'] + 1); // Правильно
echo 'Текущий год: ' . ($time['tm_year'] + 1900); // Правильно
?>Текущий месяц: 8 Текущий год: 2024
Распространенная ошибка - вывод значений без корректировки. Месяц в localtime() имеет диапазон 0-11, а год отсчитывается с 1900.
<?php
date_default_timezone_set('Europe/Moscow');
$time1 = localtime();
date_default_timezone_set('America/New_York');
$time2 = localtime();
print_r([$time1['tm_hour'], $time2['tm_hour']]);
?>Array
(
[0] => 19
[1] => 12
)Функция зависит от настройки временной зоны PHP (date_default_timezone_set). Неучет этого факта приводит к неожиданным результатам при работе в разных географических локациях.
- PHP 8.0.0: Параметр timestamp стал nullable. Теперь можно явно передать null для использования текущего времени, что согласуется с другими функциями работы со временем. Ранее ожидался строго целочисленный аргумент.
- В версиях до PHP 5.1 поведение функции могло отличаться при непереданном timestamp, но сейчас это полностью стабилизировано.
<?php
$time1 = localtime(mktime(0,0,0,1,1,2023), true);
$time2 = localtime(mktime(0,0,0,8,11,2024), true);
$diffYears = $time2['tm_year'] - $time1['tm_year'];
$diffMonths = $time2['tm_mon'] - $time1['tm_mon'];
$diffDays = $time2['tm_mday'] - $time1['tm_mday'];
if ($diffDays < 0) {
$diffMonths--;
$diffDays += 31; // Упрощенный расчет
}
if ($diffMonths < 0) {
$diffYears--;
$diffMonths += 12;
}
echo "Разница: $diffYears лет, $diffMonths месяцев, $diffDays дней";
?>Разница: 1 лет, 7 месяцев, 10 дней
<?php
date_default_timezone_set('Europe/London');
$winter = localtime(mktime(12,0,0,1,15,2024), true);
$summer = localtime(mktime(12,0,0,6,15,2024), true);
echo 'Зимой isdst: ' . $winter['tm_isdst'] . "\n";
echo 'Летом isdst: ' . $summer['tm_isdst'] . "\n";
?>Зимой isdst: 0 Летом isdst: 1
<?php
function formatLocaltime($timestamp = null, $format = 'Y-m-d H:i:s') {
$lt = localtime($timestamp, true);
$year = $lt['tm_year'] + 1900;
$month = $lt['tm_mon'] + 1;
$day = $lt['tm_mday'];
$hour = $lt['tm_hour'];
$min = $lt['tm_min'];
$sec = $lt['tm_sec'];
$replace = [
'Y' => $year,
'm' => str_pad($month, 2, '0', STR_PAD_LEFT),
'd' => str_pad($day, 2, '0', STR_PAD_LEFT),
'H' => str_pad($hour, 2, '0', STR_PAD_LEFT),
'i' => str_pad($min, 2, '0', STR_PAD_LEFT),
's' => str_pad($sec, 2, '0', STR_PAD_LEFT)
];
return strtr($format, $replace);
}
echo formatLocaltime(null, 'd.m.Y H:i');
?>11.08.2024 19:02
<?php
$weekDaysRu = ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'];
$time = localtime(time(), true);
echo 'Сегодня: ' . $weekDaysRu[$time['tm_wday']];
?>Сегодня: воскресенье
Localtime в Python
import time
local_time = time.localtime()
print(local_time)time.struct_time(tm_year=2024, tm_mon=8, tm_mday=11, tm_hour=19, tm_min=2, tm_sec=15, tm_wday=6, tm_yday=224, tm_isdst=1)
В Python функция time.localtime() возвращает объект struct_time, который похож на ассоциативный массив, но доступ к полям осуществляется через точечную нотацию.
Localtime в Javascript
let date = new Date();
console.log({
seconds: date.getSeconds(),
minutes: date.getMinutes(),
hours: date.getHours(),
mday: date.getDate(),
mon: date.getMonth(), // 0-11
year: date.getFullYear() - 1900,
wday: date.getDay(),
yday: Math.floor((date - new Date(date.getFullYear(), 0, 0)) / 86400000),
isdst: null // требует сложного расчета
});{seconds: 15, minutes: 2, hours: 19, mday: 11, mon: 7, year: 124, wday: 0, yday: 224, isdst: null}В JavaScript нет прямой аналогии, но данные можно получить через методы объекта Date. Расчет дня года и летнего времени выполняется отдельно.
Localtime в MySQL
SELECT
EXTRACT(SECOND FROM NOW()) as tm_sec,
EXTRACT(MINUTE FROM NOW()) as tm_min,
EXTRACT(HOUR FROM NOW()) as tm_hour,
EXTRACT(DAY FROM NOW()) as tm_mday,
EXTRACT(MONTH FROM NOW()) - 1 as tm_mon,
EXTRACT(YEAR FROM NOW()) - 1900 as tm_year,
DAYOFWEEK(NOW()) - 1 as tm_wday,
DAYOFYEAR(NOW()) as tm_yday;
-- Определение летнего времени в MySQL нетривиальноtm_sec: 15, tm_min: 2, tm_hour: 19, tm_mday: 11, tm_mon: 7, tm_year: 124, tm_wday: 0, tm_yday: 224
В SQL запросах компоненты времени извлекаются функциями EXTRACT, DAYOFWEEK, DAYOFYEAR. Месяц возвращается в диапазоне 1-12, поэтому требуется коррекция.