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

Использование функции localtime для работы с локальным временем
Раздел: Дата и время
localtime(?int $timestamp = null, bool $associative = false): array
Функция localtime в PHP

Функция localtime() возвращает информацию о локальном времени в виде индексированного или ассоциативного массива. Она часто применяется для получения структурированных данных о времени без использования объектов DateTime, особенно в устаревшем коде.

Аргументы функции
  • timestamp (необязательный) - Метка времени Unix. Если не указана или равна null, используется текущее время (time()).
  • associative (необязательный) - Логический флаг, определяющий тип возвращаемого массива. При значении false (по умолчанию) возвращается индексированный массив. При true - ассоциативный.
Примеры использования localtime
Получение индексированного массива
<?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
)
Аналогичные функции в PHP
  • 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
  • PHP 8.0.0: Параметр timestamp стал nullable. Теперь можно явно передать null для использования текущего времени, что согласуется с другими функциями работы со временем. Ранее ожидался строго целочисленный аргумент.
  • В версиях до PHP 5.1 поведение функции могло отличаться при непереданном timestamp, но сейчас это полностью стабилизировано.
Расширенные примеры
Расчет разницы между датами в структуре tm
Пример php
<?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
<?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
Формирование пользовательского формата из массива localtime
Пример php
<?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
<?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, поэтому требуется коррекция.

PHP localtime function comments

En
Localtime Get the local time