PHP: как получить год из даты (примеры и способы)

Раздел: Стандартные функции -> Дата и время

Основные способы получения года

В PHP существует несколько подходов для извлечения года из даты. Наиболее эффективным и универсальным решением является использование функции date() или метода DateTime::format(). Эти инструменты работают практически во всех версиях PHP и поддерживают широкий диапазон дат.

Самый простой способ получить текущий год - вызвать date('Y'). Функция возвращает четырёхзначное строковое представление года:


<?php
$year = date('Y');
echo $year;
?>
  

Php дате (работа с датами в php)

2025
  

Php получить год (получение года в php)

Альтернативный вариант с использованием объектно-ориентированного подхода - (new DateTime())->format('Y'). Этот метод также возвращает строку, но позволяет удобно работать с временными зонами и дополнительными операциями:


<?php
$dateTime = new DateTime();
echo $dateTime->format('Y');
echo (new DateTime())->format('Y'); // однострочная запись
?>
  

Оба варианта являются стандартными и рекомендуемыми для большинства задач.

Как получить год из произвольной строки с датой?

Если дата представлена строкой (например, '2025-03-15' или '15.03.2025'), можно использовать strtotime() вместе с date():


<?php
$dateString = '2025-03-15';
$year = date('Y', strtotime($dateString));
echo $year;
?>
  

Проблема: strtotime() ограничен в распознавании нестандартных форматов. Для строки '15/03/2025' он может вернуть false. Решение - использовать DateTime::createFromFormat(), который позволяет явно указать формат:


<?php
$dateString = '15/03/2025';
$dt = DateTime::createFromFormat('d/m/Y', $dateString);
if ($dt) {
    echo $dt->format('Y');
} else {
    echo 'Ошибка парсинга даты';
}
?>
    

Как получить год в виде целого числа без форматирования?

Функция idate() возвращает целое число (int) для заданного компонента даты. Для года используется формат 'Y':


<?php
$yearInt = idate('Y');
echo $yearInt; // int(2025)
var_dump($yearInt);
?>
  

Проблема: idate('Y') не поддерживает отрицательные годы (до нашей эры) и может давать неожиданные результаты для очень старых дат. Для большинства современных дат (после 1970) работает надёжно.

Как получить год с учётом часового пояса?

При работе с датами из разных регионов необходимо учитывать часовой пояс. DateTime позволяет задать временную зону и получить соответствующий год:


<?php
$dt = new DateTime('now', new DateTimeZone('Europe/Moscow'));
echo $dt->format('Y');

$dt->setTimezone(new DateTimeZone('America/New_York'));
echo $dt->format('Y');
?>
  

Проблема: Если не указать временную зону, используется зона сервера. Это может привести к неверному году при переходе через полночь в другом регионе. Всегда явно задавайте DateTimeZone, если требуется конкретная зона.

Как получить ISO-недельный год?

Стандарт ISO 8601 определяет номер года, относящийся к неделе. Иногда последние дни декабря могут относиться к первой неделе следующего года. Для получения такого года используется формат 'o' (строчная буква o):


<?php
echo date('Y') . ' - ' . date('o'); // обычно одинаково
// для 31 декабря 2025 года (если 1 января 2026 - среда?)
echo date('o', strtotime('2025-12-31'));
?>
  

Проблема: Разработчики часто путают 'Y' и 'o'. Для большинства дат они совпадают, но на стыке года разница критична. Используйте 'o' только если вам нужен именно недельный год.

Как получить год с помощью устаревшей функции strftime?

strftime() позволяла форматировать дату с учётом локали (например, названия месяцев на русском). Для года использовался формат '%Y':


<?php
setlocale(LC_TIME, 'ru_RU.UTF-8');
echo strftime('%Y');
?>
  

Проблема: Функция strftime() объявлена устаревшей (deprecated) в PHP 8.1 и будет удалена в будущих версиях. Для новых проектов рекомендуется использовать IntlDateFormatter или DateTime с локализацией.

Как получить год из метки времени Unix (timestamp)?

Метка времени - целое число секунд с 1 января 1970 года. Год извлекается передачей timestamp вторым аргументом в date():


<?php
$timestamp = 1742083200; // примерно 2025-03-16
echo date('Y', $timestamp);

// Использование DateTime
$dt = new DateTime();
$dt->setTimestamp($timestamp);
echo $dt->format('Y');
?>
  

Проблема: На 32-битных системах timestamp ограничен диапазоном от 1901 до 2038 (проблема 2038 года). На 64-битных версиях PHP проблема отсутствует. Для дат до 1970 года timestamp может быть отрицательным, и date() корректно обрабатывает их на 64-бит.

Как получить год для дат до 1000 года нашей эры?

date('Y') возвращает четырёхзначный год, дополняя нулями слева (например, '0999'). Это строка, которую можно преобразовать в целое число с помощью intval(). Для отрицательных годов (до н.э.) date() не подходит. В таких случаях следует использовать расширенные библиотеки, например Carbon (не входит в стандартный PHP) или работать с юлианским календарём через cal_from_jd().

Проблема: Стандартный PHP не поддерживает даты до 0 года. Любая работа с античными датами требует внешних решений.

Расширенные примеры получения года

Пример 1. Функция безопасного извлечения года из строки с произвольным форматом

Создадим функцию, которая принимает строку даты и формат, а возвращает год или null при ошибке:

Пример

<?php
function extractYear(string $dateString, string $format = 'Y-m-d'): ?int {
    $dt = DateTime::createFromFormat($format, $dateString);
    if (!$dt) {
        // Дополнительная проверка: ошибки парсинга
        $errors = DateTime::getLastErrors();
        if ($errors['warning_count'] > 0 || $errors['error_count'] > 0) {
            return null;
        }
        return null;
    }
    return (int)$dt->format('Y');
}

// Тестирование
$dates = [
    '2025-03-15',
    '15/03/2025' => 'd/m/Y',
    'March 15, 2025' => 'F j, Y',
    'invalid',
];

foreach ($dates as $date => $fmt) {
    if (is_int($date)) { // для ассоциативного массива
        $result = extractYear($date, 'Y-m-d');
        echo "$date -> " . ($result ?? 'null') . "\n";
    } else {
        $result = extractYear($date, $fmt);
        echo "$date (формат $fmt) -> " . ($result ?? 'null') . "\n";
    }
}
?>
2025-03-15 -> 2025
15/03/2025 (формат d/m/Y) -> 2025
March 15, 2025 (формат F j, Y) -> 2025
invalid -> null

Пример 2. Получение года из списка дат с разными форматами и обработка исключений

Предположим, имеется массив строк, каждая из которых может быть в одном из нескольких форматов. Попробуем извлечь год, используя DateTimeImmutable и перебор форматов:

Пример

<?php
$dateStrings = [
    '2025-08-21',
    '21-08-2025',
    '08/21/2025',
    '21.08.2025',
    '20250821',
];

$formats = ['Y-m-d', 'd-m-Y', 'm/d/Y', 'd.m.Y', 'Ymd'];

foreach ($dateStrings as $str) {
    $year = null;
    foreach ($formats as $format) {
        $dt = DateTimeImmutable::createFromFormat($format, $str);
        if ($dt !== false) {
            $year = $dt->format('Y');
            break;
        }
    }
    echo "$str -> " . ($year ?? 'не удалось') . "\n";
}
?>
2025-08-21 -> 2025
21-08-2025 -> 2025
08/21/2025 -> 2025
21.08.2025 -> 2025
20250821 -> 2025

Пример 3. Разница между календарным годом (Y) и ISO-недельным годом (o)

Рассмотрим дату 31 декабря 2025 года. Если 1 января 2026 - четверг, то неделя, содержащая 31 декабря, может относиться к 2026 году по ISO 8601. Пример (используем фиксированную дату для демонстрации):

Пример

<?php
// Предположим, что 31.12.2025 - это день, который по ISO относится к 2026 году
// Для реальной проверки возьмём 31 декабря 2025
$timestamp = strtotime('2025-12-31');
echo "Календарный год: " . date('Y', $timestamp) . "\n";
echo "ISO-недельный год: " . date('o', $timestamp) . "\n";

// Ещё пример с 1 января 2027, если оно относится к 2026 году
$timestamp2 = strtotime('2027-01-01');
echo "1 января 2027: календарный = " . date('Y', $timestamp2) . ", ISO = " . date('o', $timestamp2);
?>
Календарный год: 2025
ISO-недельный год: 2026
1 января 2027: календарный = 2027, ISO = 2026

Пример 4. Получение года в нескольких часовых поясах

Покажем, как один и тот же момент времени может относиться к разным годам в разных поясах. Используем DateTimeImmutable для наглядности:

Пример

<?php
$moment = new DateTimeImmutable('2025-12-31 23:30:00', new DateTimeZone('UTC'));

echo "UTC: " . $moment->format('Y') . "\n";

$tokyo = $moment->setTimezone(new DateTimeZone('Asia/Tokyo'));
echo "Токио: " . $tokyo->format('Y') . "\n"; // может стать уже 2026

$newyork = $moment->setTimezone(new DateTimeZone('America/New_York'));
echo "Нью-Йорк: " . $newyork->format('Y') . "\n"; // ещё 2025
?>
UTC: 2025
Токио: 2026
Нью-Йорк: 2025

Пример 5. Работа с отрицательными timestamp (даты до 1970 года) на 64-битной системе

На 64-битном PHP можно получить год из timestamp, соответствующего, например, 1 января 1900 года:

Пример

<?php
$oldTimestamp = -2208988800; // 1900-01-01 00:00:00 UTC
echo date('Y', $oldTimestamp) . "\n";

$dt = new DateTime();
$dt->setTimestamp($oldTimestamp);
echo $dt->format('Y');
?>
1900
1900

Пример 6. Использование idate() для массовой обработки дат

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

Пример

<?php
$timestamps = [
    strtotime('2020-01-01'),
    strtotime('2025-06-15'),
    strtotime('2030-12-31'),
];

$years = array_map('idate', array_fill(0, count($timestamps), 'Y'), $timestamps);
print_r($years);
?>
Array
(
    [0] => 2020
    [1] => 2025
    [2] => 2030
)

Получение года в PHP - comments

En
Php получить год (php)