PHP Календарь
Работа с датами, временем и календарями в PHP: функции date(), mktime(), strtotime() и класс DateTime с примерами и лучшими практиками.
Введение
В этой главе рассматривается работа с датами, временем и календарями в PHP. Вы изучите основные функции для работы с датами и временем, научитесь строить сетку календаря для заданного месяца, а также узнаете о лучших практиках, позволяющих сохранять корректность логики дат при разных часовых поясах. Каждый пример небольшой и работоспособный — вы можете вставить его прямо в PHP-файл.
Для более глубокого изучения отдельных тем см. связанные главы: Дата и время в PHP, функция date() и Часовые пояса в PHP.
Функции PHP для работы с датами и временем
PHP предоставляет богатый набор функций для форматирования, вычисления и управления датами, временем и часовыми поясами. Эти функции необходимы в приложениях, которым требуется работа с временными данными: планировщиках, системах бронирования и, конечно, в календарях.
PHP также поставляется с отдельным расширением Calendar (cal_days_in_month(), jdtogregorian() и другими) для преобразования между системами летоисчисления: юлианской, григорианской и еврейской. Их часто путают: расширение Calendar конвертирует между системами, тогда как функции дата/время ниже отвечают за повседневное форматирование и арифметику. Большинству задач «построить календарь» достаточно лишь функций дата/время.
Основные функции PHP для работы с датами и временем
date()— форматирует строку локальной даты и времени по заданному формату.echo date("Y-m-d H:i:s"); // Outputs: 2023-10-25 14:30:00mktime()— создаёт Unix-временную метку для указанной даты и времени.Примечание:echo mktime(14, 30, 0, 10, 25, 2023); // Outputs: 1698237000mktime()использует часовой пояс сервера по умолчанию. Для воспроизводимых результатов явно задавайте часовой пояс с помощьюdate_default_timezone_set()илиDateTimeZone.strtotime()— разбирает строку с датой и временем на английском языке и преобразует её в Unix-временную метку.echo strtotime("now"); // Outputs: current timestamp echo strtotime("+1 day"); // Outputs: timestamp for tomorrowtime()— возвращает текущую Unix-временную метку.echo time(); // Outputs: current timestampDateTimeиDateTimeImmutable— объектно-ориентированные классы для более безопасного управления датами/временем и их форматирования.$dt = new DateTime('2023-10-25 14:30:00'); echo $dt->format('Y-m-d H:i:s');
Помимо перечисленных, существует множество других функций для работы с датами и временем. Понимание их работы позволяет создавать эффективные и надёжные PHP-приложения.
Сколько дней в месяце?
Распространённая задача при работе с календарём — определить количество дней в заданном месяце, которое варьируется и зависит от того, является ли год високосным (для февраля). Есть два надёжных способа сделать это:
// Using the Calendar Extension (requires ext-calendar)
echo cal_days_in_month(CAL_GREGORIAN, 2, 2024); // Outputs: 29 (2024 is a leap year)
// Using date() with the 't' format character (no extension needed)
echo date('t', mktime(0, 0, 0, 2, 1, 2024)); // Outputs: 29Подход date('t', ...) переносим, поскольку не требует установленного расширения Calendar.
Построение простого календаря для месяца
Собирая всё воедино, рассмотрим, как вывести дни месяца, выровненные по столбцам дней недели. Первый день недели месяца находим с помощью date('w', ...) (0 = воскресенье), а количество дней — через date('t', ...):
$month = 10;
$year = 2023;
$firstDayTimestamp = mktime(0, 0, 0, $month, 1, $year);
$daysInMonth = (int) date('t', $firstDayTimestamp);
$startWeekday = (int) date('w', $firstDayTimestamp); // 0 = Sunday
echo "Su Mo Tu We Th Fr Sa\n";
// Pad the first row so day 1 lands under the correct weekday.
echo str_repeat(' ', $startWeekday);
for ($day = 1; $day <= $daysInMonth; $day++) {
printf('%2d ', $day);
// Break to a new line after Saturday.
if (($startWeekday + $day) % 7 === 0) {
echo "\n";
}
}
echo "\n";Этот цикл выводит октябрь 2023 года в виде сетки календаря. Подробнее о циклах см. в главе Циклы в PHP.
Лучшие практики использования функций PHP для работы с датами и временем
При использовании функций PHP для работы с датами и временем важно следовать лучшим практикам, чтобы приложения оставались эффективными и надёжными. Вот несколько советов:
- Предпочитайте объекты
DateTimeиDateTimeImmutableпроцедурным функциям — они обеспечивают лучшую читаемость и встроенную защиту от проблем с часовыми поясами. - Всегда задавайте явный часовой пояс с помощью
DateTimeZoneилиdate_default_timezone_set(), чтобы избежать неожиданных смещений при переходе на летнее время или при миграции серверов. - Проверяйте разобранные даты с помощью
DateTime::getLastErrors(), чтобы своевременно обнаруживать некорректный ввод и не допускать скрытых сбоев. - Кэшируйте вычисленные временные метки или отформатированные строки внутри интенсивных циклов, чтобы снизить накладные расходы на вызовы функций.
Заключение
Функции PHP для работы с датами и временем — неотъемлемая часть любого PHP-приложения, которому требуется работа с временными данными. Понимая, как работают эти функции, и следуя лучшим практикам, вы сможете создавать надёжные и эффективные приложения.