Как программно определить год по заданной дате в PHP

Раздел: Программирование на PHP -> Работа с датами в PHP

Извлечение года из даты: основные подходы

Наиболее эффективное решение: использование функций date() или DateTime::format()

Функция date('Y') возвращает год в виде четырехзначной строки из переданной метки времени Unix. Если метка не указана, используется текущее время. Для объектов DateTime метод format('Y') дает аналогичный результат. Эти методы работают быстро и предсказуемо.

$year = date('Y', strtotime('2025-03-15')); // '2025'
$dt = new DateTime('2025-03-15');
$year = $dt->format('Y'); // '2025'

В большинстве случаев именно такой подход является оптимальным по производительности и читаемости.

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

Используйте DateTime::createFromFormat() для разбора строки с четко заданным шаблоном.

$dateStr = '15/03/2025'; // формат d/m/Y
$dt = DateTime::createFromFormat('d/m/Y', $dateStr);
$year = $dt->format('Y'); // '2025'

Этот способ гарантирует корректный разбор даже при нестандартном порядке компонентов даты. Цель: когда формат ввода строго известен и не меняется.

Типичная ошибка: если строка не соответствует формату, createFromFormat() возвращает false. Обращение к методу format() у false вызовет фатальную ошибку. Решение: всегда проверять результат.

$dt = DateTime::createFromFormat('d/m/Y', '2025-03-15');
if ($dt === false) {
    // обработка ошибки парсинга
}

Как извлечь год из строки в популярных форматах, например, '2025-03-15'?

Функция strtotime() преобразует текстовую дату в метку времени, после чего date('Y') выдает год.

$timestamp = strtotime('2025-03-15');
if ($timestamp !== false) {
    $year = date('Y', $timestamp); // '2025'
}

Когда использовать: для строк, похожих на дату, которые понимает парсер PHP (например, "today", "next Monday", "2025-03-15 10:00:00").

Проблема: strtotime() может вернуть false для нераспознанных форматов или локальных записей. Кроме того, он зависит от часового пояса по умолчанию. Решение: установить явно часовой пояс через date_default_timezone_set() и проверять результат на false.

Как извлечь год из даты на русском языке, например, '15 марта 2025'?

Для локализованных дат применяется класс IntlDateFormatter из расширения intl.

$formatter = new IntlDateFormatter('ru_RU', IntlDateFormatter::LONG, IntlDateFormatter::NONE);
$timestamp = $formatter->parse('15 марта 2025');
if ($timestamp !== false) {
    $year = date('Y', $timestamp); // '2025'
}

Цель: обработка пользовательского ввода на разных языках, интеграция с локализованными источниками данных.

Ошибка: если расширение intl не установлено, класс не существует. Проверьте наличие class_exists('IntlDateFormatter'). Также некорректная локаль или строка, не соответствующая шаблону, приведут к false.

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

Если уже есть метка времени (например, из базы данных или API), достаточно вызвать date('Y', $timestamp).

$timestamp = 1744675200; // соответствует 2025-03-15 00:00:00 UTC
$year = date('Y', $timestamp); // '2025'

Это базовый случай, не требующий парсинга строк.

Проблем в этом случае практически нет, если метка времени корректна. Стоит помнить о часовом поясе: если метка в UTC, а нужен год по местному времени, необходимо установить часовой пояс.

Как вытащить год из строки фиксированного формата без функций дат?

Если строка всегда имеет одинаковую структуру (например, '2025-03-15'), год можно извлечь с помощью substr() или explode().

$dateStr = '2025-03-15';
$year = substr($dateStr, 0, 4); // '2025'
// или
$parts = explode('-', $dateStr);
$year = $parts[0];

Когда применять: при обработке огромных объемов данных, где производительность критична, и формат гарантированно не меняется. Это самый быстрый способ, так как не требует парсинга даты.

Риск: если формат изменится (например, добавится время или другой разделитель), код сломается. Такой подход не проверяет корректность даты (например, '9999-99-99' даст год '9999' без ошибки).

Дополнительные примеры извлечения года

Пример
// Пример 1: Учет часового пояса
$timezone = new DateTimeZone('Europe/Moscow');
$date = new DateTime('2025-03-15', $timezone);
$year = $date->format('Y');
echo $year; // 2025
2025

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

Пример
// Пример 2: Нестандартный разделитель даты
$dateStr = '15/03/2025';
$dt = DateTime::createFromFormat('d/m/Y', $dateStr);
if ($dt) {
    $year = $dt->format('Y');
    echo $year; // 2025
}
2025

Пояснение: формат 'd/m/Y' соответствует европейскому стилю. Можно задать любой другой разделитель ('.', '-', пробел).

Пример
// Пример 3: Дата в формате ISO 8601 с временем
$iso = '2025-03-15T12:00:00+03:00';
$dt = new DateTime($iso);
$year = $dt->format('Y');
echo $year; // 2025
2025

Пояснение: DateTime корректно разбирает строку ISO 8601, учитывая смещение часового пояса.

Пример
// Пример 4: Использование Carbon (расширение Laravel)
$date = Carbon\Carbon::parse('2025-03-15');
$year = $date->year; // целое число 2025
2025

Пояснение: Carbon предоставляет удобное свойство year, возвращающее год как целое число. Требуется установка библиотеки.

Пример
// Пример 5: Год из даты рождения для вычисления возраста
$birthday = '1990-05-20';
$birthYear = (int)date('Y', strtotime($birthday));
$currentYear = (int)date('Y');
$age = $currentYear - $birthYear;
echo $age; // 35 (в 2025 году)
35

Пояснение: простой расчёт возраста без учёта месяца и дня. Для точного возраста лучше использовать разность объектов DateTime.

Пример
// Пример 6: Год из timestamp с миллисекундами
$millis = 1744675200000; // ms
$seconds = intdiv($millis, 1000);
$year = date('Y', $seconds);
echo $year; // 2025
2025

Пояснение: метки времени в JavaScript и некоторых API хранятся в миллисекундах. Перед передачей в date() необходимо разделить на 1000.

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

En
Php дата год (php)