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
)