Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11149 глав4458 карточек справочника
Дерево руководства

Глава 85 · Сначала база, затем практика

Calendar: календари, номера дней и преобразования

Все функции Calendar: от простой даты до исторического импорта, подписей, Unix timestamp и расчёта праздников.

Один день в разных календарях: что именно мы переводим

Наглядная модель

Один день — две календарные подписи

Источник назвал 2 июня 2024 по юлианскому календарю. Для сайта нужна григорианская дата этого же дня.

  1. Julian: 6/2/2024

    Источник явно сообщил календарь и порядок: месяц, день, год.

  2. juliantojd → 2460477

    Общий целый номер дня связывает календарные системы.

  3. jdtogregorian

    Тот же номер переводится в григорианские компоненты.

  4. Gregorian: 6/15/2024

    15 июня — другая подпись того же дня, часы компьютера не менялись.

JDN описывает день. Для момента с часами, поясом и переходом DST нужен Date/Time; постоянная поправка «13 дней» не подходит всем историческим датам.

Музей получает документ со старым стилем, сервис событий хранит еврейскую дату, а посетитель ожидает привычную календарную подпись. Calendar переводит дату между четырьмя системами. Полезный результат: 2 июня 2024 юлианского календаря и 15 июня григорианского получат одинаковый номер дня 2460477.

Представьте листы общего календаря с непрерывными номерами. На одном листе можно написать несколько календарных подписей. Номер здесь называется Julian Day Count, сокращённо JDN. Он не равен юлианскому календарю: первое — общий счёт дней, второе — правила именования даты. Историческая точка отсчёта связана с 1 января 4713 до н. э. по юлианскому календарю; нулевой JDN у ряда функций служит также признаком недопустимого входа.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

Две подписи одного дня
  1. Юлианская запись: 6/2/2024
  2. juliantojd → общий номер 2460477
  3. jdtogregorian → григорианская запись 6/15/2024
Первое самостоятельное преобразованиеСамостоятельный пример
<?php
$jd = juliantojd(6, 2, 2024);
echo $jd, "\n";
echo jdtogregorian($jd), "\n";
Ожидаемый результат
2460477
6/15/2024

Оба вызова только рассчитывают значения. Ни сайт, ни часы компьютера не меняются. Скрипт можно сохранить в example.php и запустить php example.php.

Граница модели листов: здесь нет времени суток, DST, региона пользователя или исторического указа о переходе. Астрономический Julian Date может содержать дробную часть и отсчитывать сутки от полудня; эти API работают с целым номером, а jdtounix специально возвращает полночь UTC. Для момента времени переходите к DateTime, интервалам и зонам.

Проверить Calendar в том PHP, который запускает сайт

На официальных Windows-сборках PHP поддержка Calendar встроена; дополнительную DLL для неё подключать не требуется. При самостоятельной сборке PHP используется --enable-calendar. Готовый пакет Linux выбирают под свой дистрибутив и версию; команда из чужого ответа не универсальна. Composer не устанавливает расширение PHP.

Почему локально работает, а на сервере нет
  1. CLI и веб-сервер могут использовать разные PHP
  2. extension_loaded проверяет именно текущий процесс
  3. При отсутствии Calendar меняют сборку/пакет нужного SAPI
  4. После изменения повторяют проверку в том же окружении
Проверить доступность в учебном окруженииСамостоятельный пример
<?php
var_dump(extension_loaded('calendar'));
var_dump(function_exists('cal_to_jd'));
Ожидаемый результат
bool(true)
bool(true)

Первый ответ показывает расширение, второй — конкретную функцию. Ожидаемый результат дан для проверенной сборки; на сервере false означает необходимость настройки или выбора альтернативы.

У Calendar в этой официальной ветке нет отдельных runtime ini-настроек, внешней библиотеки или resource-типа. Публичный phpinfo ради проверки не нужен: достаточно ограниченной диагностики в CLI или защищённом окружении. Для одной только длины григорианского месяца можно использовать DateTime::format("t"); для перевода Jewish/French это не замена.

Выбрать систему, диапазон и проверку входа

Начните с вопроса «каким календарём подписан источник?». Дата 06/02/2024 без системы и порядка компонентов неоднозначна. Во всех функциях *tojd ниже порядок месяц, день, год; cal_to_jd дополнительно принимает систему первым аргументом.

СистемаБазовый диапазонЧто легко перепутать
GregorianОт 25.11.4714 до н. э. до как минимум 31.12.9999; месяцы 1…12.Нет года 0; 31 февраля нормализуется. Исторический переход отдельно.
Julian4713 до н. э.…9999; месяцы 1…12.Разница с Gregorian не всегда 13 дней.
JewishГоды 1…9999, месяцы 1…13.Обычный Adar занимает номер 7; 6 может быть эквивалентным вводом.
FrenchГоды I…XIV, 22.09.1792…22.09.1806 Gregorian.13-й период имеет только 5/6 дней, хотя прямой API принимает день до 30.
Проверяем запись, не только число результата
  1. Источник: Gregorian 2/31/2024
  2. Числа правильного типа, но дата невозможна
  3. checkdate → false; преобразование нормализовало бы в 3/2/2024
  4. Отклоняем запись до сохранения
Увидеть переход через нашу эруСамостоятельный пример
<?php
$last = gregoriantojd(12, 31, -1);
echo jdtogregorian($last + 1), "\n";
var_dump(gregoriantojd(1, 1, 0));
Ожидаемый результат
1/1/1
int(0)

+1 перемещает номер на следующий календарный день. Calendar пропускает год 0; свободный парсер DateTime использует астрономическую нумерацию. Для древней даты нужна явная адаптация системы, а не слепое копирование year.

При импорте сначала проверяют тип/диапазон, затем существование даты и возможную канонизацию. Одного ненулевого JDN мало. Для Gregorian checkdate удобнее самодельной таблицы високосных лет; для других систем проверяют длину и обратные компоненты. cal_from_jd отдаёт поля без повторного разбора строки.

Все константы Calendar: разные семейства нельзя смешивать

Константа — именованное число. Числа нескольких семейств совпадают, но назначение различается: CAL_JULIAN и CAL_MONTH_GREGORIAN_LONG оба равны 1. PHP не хранит для этих int отдельный тип «система» или «режим имени». Выбор читают по названию аргумента.

КонстантаЗначениеДля чего
CAL_GREGORIAN0Григорианский календарь, математически продолженный назад.
CAL_JULIAN1Юлианский календарь; не номер Julian Day Count.
CAL_JEWISH2Еврейский календарь; номера месяцев сохраняют слот Adar I.
CAL_FRENCH3Французский республиканский, поддерживаются годы I…XIV.
CAL_NUM_CALS4Количество систем, само по себе не ID календаря.
CAL_DOW_DAYNO0jddayofweek: число 0 Sunday…6 Saturday.
CAL_DOW_LONG1jddayofweek: полное английское название.
CAL_DOW_SHORT2jddayofweek: сокращённое название.
CAL_MONTH_GREGORIAN_SHORT0jdmonthname: Jan…Dec.
CAL_MONTH_GREGORIAN_LONG1jdmonthname: January…December.
CAL_MONTH_JULIAN_SHORT2Короткая подпись юлианского месяца.
CAL_MONTH_JULIAN_LONG3Полная подпись юлианского месяца.
CAL_MONTH_JEWISH4Имя еврейского месяца с учётом года.
CAL_MONTH_FRENCH5Имя республиканского месяца; 13-й Extra.
CAL_EASTER_DEFAULT0Julian до 1753, Gregorian с 1753.
CAL_EASTER_ROMAN1Julian до 1583, Gregorian с 1583.
CAL_EASTER_ALWAYS_GREGORIAN2Всегда григорианское правило, включая ранние годы.
CAL_EASTER_ALWAYS_JULIAN3Всегда юлианское правило; перевод даты — отдельное действие.
CAL_JEWISH_ADD_ALAFIM_GERESH2Знак geresh после тысяч в буквенном году.
CAL_JEWISH_ADD_ALAFIM4Слово alafim между тысячами и остатком года.
CAL_JEWISH_ADD_GERESHAYIM8Знаки перед последней буквой записи дня/года.
Нужна полная подпись юлианского месяца
  1. JDN 1 июля 2024 Gregorian
  2. mode = CAL_MONTH_JULIAN_LONG
  3. jdmonthname сначала переводит календарь
  4. Возвращает June
Почему совпадающее число не означает одинаковый смыслСамостоятельный пример
<?php
$jd = gregoriantojd(7, 1, 2024);
echo jdmonthname($jd, CAL_JULIAN), "\n";
echo jdmonthname($jd, CAL_MONTH_JULIAN_LONG), "\n";
echo CAL_NUM_CALS, "\n";
Ожидаемый результат
July
June
4

Первый вызов допустим как int, но решает другую задачу: значение 1 означает Gregorian long в параметре mode. Используйте константу именно нужного семейства.

Три CAL_JEWISH_ADD_* — независимые флаги: | объединяет их, например ALAFIM_GERESH | GERESHAYIM. Остальные режимы выбирают по одному. Константы существуют только когда доступно расширение. Режимы Пасхи выбирают алгоритм; они не определяют часовой пояс и не заменяют перевод между календарями.

Отдельная функция: преобразование записи при импорте

В простом опыте числа стояли прямо в вызове. Теперь два документа приходят как массивы записей. Каждая запись явно называет календарь; общий импорт превращает её в JDN. Значения демонстрационного массива уже доверенные целые. Для JSON/формы добавляют проверку типов и полей до этого шага.

[...] создаёт массив, "ключ" => значение подписывает поле. foreach берёт записи по одной. function ... { return ...; } объявляет действие и возвращает результат. Массив; Функция.

Две записи импорта
  1. Одна запись Gregorian 6/15/2024, другая Julian 6/2/2024
  2. Функция берёт calendar, month, day, year
  3. cal_to_jd возвращает одинаковый 2460477
  4. Индекс связывает документы с одним днём
Общий обработчик двух источниковСамостоятельный пример
<?php
function dayNumber($record) {
    return cal_to_jd($record['calendar'], $record['month'], $record['day'], $record['year']);
}
$records = [
    ['calendar' => CAL_GREGORIAN, 'month' => 6, 'day' => 15, 'year' => 2024],
    ['calendar' => CAL_JULIAN, 'month' => 6, 'day' => 2, 'year' => 2024],
];
foreach ($records as $record) { echo dayNumber($record), "\n"; }
Ожидаемый результат
2460477
2460477

Функция устраняет повторение соглашения о порядке аргументов. Это не готовый внешний API: здесь нет HTTP, базы и непроверенных данных.

Сохраняйте исходные компоненты и тип календаря рядом с нормализованным днём. Так можно объяснить результат пользователю и пересчитать записи при исправлении исходника. Для повторяющегося события также храните правило повтора: один вычисленный день не описывает будущие годы.

Следующий шаг: календарь магазина и ограничения стоимости

Задача: получить русские подписи первых трёх дней июня 2024 для виджета расписания. Сначала найдите JDN первого дня, затем прибавляйте смещение и берите номер дня недели. Здесь нужен календарный список, а не интервал в секундах.

for ($offset = 0; $offset < 3; $offset++): начинаем с 0, повторяем пока меньше 3, после каждого шага увеличиваем на 1. Цикл и остановка.

От начала месяца к трём ячейкам
  1. Первый день: 1 июня 2024
  2. JDN + 0, затем +1, затем +2
  3. jddayofweek → 6, 0, 1
  4. Таблица подписей → Сб, Вс, Пн
Вариант решения: три подписиСамостоятельный пример
<?php
$labels = ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'];
$first = gregoriantojd(6, 1, 2024);
for ($offset = 0; $offset < 3; $offset++) {
    $jd = $first + $offset;
    echo jdtogregorian($jd), ': ', $labels[jddayofweek($jd)], "\n";
}
Ожидаемый результат
6/1/2024: Сб
6/2/2024: Вс
6/3/2024: Пн

Продолжение упражнения: замените 3 на cal_days_in_month(CAL_GREGORIAN, 6, 2024). Не включайте дополнительный 31-й день: июнь имеет 30.

Для N ячеек цикл выполняет N преобразований: ограничьте диапазон пользователя, чтобы не строить миллионы дней в одном ответе. Не делайте SQL-запрос для каждой ячейки; события выбранного диапазона читают одним запросом и объединяют в памяти. Нет универсально «самой быстрой» календарной функции: проверяют свою нагрузку. Безопасный запрос диапазона; Измерение затрат.

Все 18 функций Calendar

Выбирайте сначала договор операции: преобразовать систему, получить поля/подпись, перейти к timestamp или рассчитать календарный праздник.

ФункцияНазначение
cal_days_in_monthФорма расписания должна разрешить 29 февраля в 2024 году, но только 28 дней в 2023. Длину месяца вычисляет выбранный календарь.
cal_from_jdКарточке архивного события нужны год, месяц, день и название дня недели отдельными полями. Получим массив вместо разбора строки с косыми чертами.
cal_infoНужен список поддерживаемых календарей и названия месяцев для административной формы. Получим метаданные, а не дату «сегодня».
cal_to_jdИмпорт принимает календарную систему отдельным полем. Один общий вызов позволяет преобразовать выбранную систему без четырёх разных веток.
easter_dateЕсли интеграция требует именно timestamp, функция возвращает системную местную полночь праздника. Для сайта с собственной зоной часто яснее easter_days плюс DateTime.
easter_daysДля расписания праздника достаточно узнать отступ от 21 марта в выбранном календаре. В 2024 григорианский отступ 10 дней даёт 31 марта.
frenchtojdКаталог революционных документов хранит год I и месяцы республиканского календаря. Получим привычную дату первого дня этого календаря.
gregoriantojdАрхиву нужно сравнить две календарные даты без часов. Превратим 15 июня 2024 в целый номер дня 2460477.
jddayofweekРасписание должно узнать, является ли выбранный день воскресеньем. Номер дня недели удобнее локализованного текста.
jdmonthnameАрхиву нужен месяц в выбранной календарной системе. У одного дня это может быть Gregorian July и Julian June.
jdtofrenchПолучить французскую республиканскую запись уже известного номера дня — для подписи записи в архиве.
jdtogregorianПолучить григорианскую запись уже известного номера дня — для подписи записи в архиве.
jdtojewishСписок событий может показать числовую еврейскую дату или подпись буквами. Выберем формат явно, чтобы однобайтный текст не испортил UTF-8 страницу.
jdtojulianПолучить юлианскую запись уже известного номера дня — для подписи записи в архиве.
jdtounixПосле календарного преобразования нужен timestamp для начала конкретного дня UTC. Здесь начало — полночь, хотя астрономический Julian Date часто связан с полуднем.
jewishtojdДля календаря мероприятий нужна дата 1 тишрея 5785: преобразуем её в 3 октября 2024 для обычного списка событий.
juliantojdДля документа со старым стилем 2 июня 2024 юлианского календаря соответствует 15 июня григорианского. Соединим их общим номером дня.
unixtojdСервису нужен только календарный день из timestamp. Функция отбрасывает время суток по локальной системной зоне; этот выбор нужно знать до группировки событий.

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

gregoriantojdАрхиву нужно сравнить две календарные даты без часов. Превратим 15 июня 2024 в целый номер дня 2460477.

PHP 4+ · calendar

gregoriantojd(int $month, int $day, int $year): int

Архиву нужно сравнить две календарные даты без часов. Превратим 15 июня 2024 в целый номер дня 2460477.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

if (условие) { ... } выполняет выбранную ветку. function name($value) { ... } объявляет повторяемое действие; return отдаёт результат вызывающему коду. === сравнивает также тип. Параметр, вызов, результат.

Часть договораСмысл
month1…12: январь имеет номер 1, не 0.
day1…31. Избыток дней внутри этого диапазона переносится в следующий месяц.
yearДокументированный диапазон −4714…9999, начиная с 25 ноября 4714 до н. э. Отрицательные годы — до н. э.; года 0 нет. Верхняя граница реализации может быть шире, но здесь на неё не опираемся.
ВозвратЦелый Julian Day Count (JDN); это не дата юлианского календаря и не Unix timestamp.
Ошибки и границыВне допустимого диапазона — 0. Существование конкретного дня месяца не проверяется: для современной григорианской формы сначала checkdate.
Путь первого преобразования
  1. 6, 15, 2024: григорианская дата
  2. gregoriantojd переводит дату в номер
  3. 2460477: общий ключ календарного дня
Перевести дату без строки и часового поясаСамостоятельный пример
<?php
$jd = gregoriantojd(6, 15, 2024);
echo $jd, "\n";
echo jdtogregorian($jd), "\n";
Ожидаемый результат
2460477
6/15/2024

Три числа передаются в явном порядке. Обратная строка использует месяц/день/год; не подставляйте её в форму dd/mm/yyyy.

Не принять 31 февраля из формыСамостоятельный пример
<?php
$month = 2;
$day = 31;
$year = 2024;
echo jdtogregorian(gregoriantojd($month, $day, $year)), "\n";
if (!checkdate($month, $day, $year)) {
    echo "reject input\n";
}
var_dump(gregoriantojd(1, 1, 0));
Ожидаемый результат
3/2/2024
reject input
int(0)

! обращает логический ответ. Первая строка показывает нормализацию, а не разрешение ошибки. checkdate применим к григорианским годам своего диапазона; это не валидатор всех исторических календарей.

Применение и ограничения. Календарь применяется пролептически, даже до его исторического введения. Для архивного документа нужны место, календарная система и правило нумерации года. Не приписывайте жителям прошлых веков современную календарную запись.

Сравните jdtogregorian, cal_to_jd, juliantojd. Как выбирать календарь.

juliantojdДля документа со старым стилем 2 июня 2024 юлианского календаря соответствует 15 июня григорианского. Соединим их общим номером дня.

PHP 4+ · calendar

juliantojd(int $month, int $day, int $year): int

Для документа со старым стилем 2 июня 2024 юлианского календаря соответствует 15 июня григорианского. Соединим их общим номером дня.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

Часть договораСмысл
month / dayМесяц 1…12, день 1…31. Это числа юлианского календаря.
yearДокументированный диапазон −4713…9999; отрицательные годы до н. э., года 0 нет. Весь диапазон не гарантирует историческую уместность системы.
ВозвратЦелый JDN; 0 при невозможном диапазоне. Переполнение длины месяца может нормализоваться.
Ошибки и границыНельзя передавать сюда обычную современную дату с сайта, если она григорианская: будет другой день. Для неё gregoriantojd.
Путь первого преобразования
  1. Старый стиль: 2 июня 2024
  2. juliantojd → 2460477
  3. jdtogregorian → 6/15/2024
Перевести старый стиль в современную записьСамостоятельный пример
<?php
$jd = juliantojd(6, 2, 2024);
echo $jd, "\n";
echo jdtogregorian($jd), "\n";
Ожидаемый результат
2460477
6/15/2024

Преобразуется календарная подпись дня, а не время или часовой пояс.

Не прибавлять фиксированные 13 дней во всех векахСамостоятельный пример
<?php
echo jdtogregorian(juliantojd(3, 1, 1900)), "\n";
echo jdtogregorian(juliantojd(3, 1, 2100)), "\n";
var_dump(juliantojd(1, 1, 0));
Ожидаемый результат
3/14/1900
3/15/2100
int(0)

Разница календарей меняется на некоторых столетиях. Преобразование через JDN устраняет хрупкую константу +13.

Применение и ограничения. Правила юлианского календаря и начало года в реальном историческом источнике могли отличаться от этой математической модели. Модуль не восстанавливает локальную историю переходов.

Сравните jdtojulian, gregoriantojd, cal_to_jd. Как выбирать календарь.

frenchtojdКаталог революционных документов хранит год I и месяцы республиканского календаря. Получим привычную дату первого дня этого календаря.

PHP 4+ · calendar

frenchtojd(int $month, int $day, int $year): int

Каталог революционных документов хранит год I и месяцы республиканского календаря. Получим привычную дату первого дня этого календаря.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

if (условие) { ... } выполняет выбранную ветку. function name($value) { ... } объявляет повторяемое действие; return отдаёт результат вызывающему коду. === сравнивает также тип. Параметр, вызов, результат.

Часть договораСмысл
month1…13: 12 месяцев по 30 дней; 13-й — дополнительные 5 или 6 дней.
dayФункция допускает 1…30, но реальный 13-й месяц короче. Его длину проверяйте отдельно.
year1…14. Поддерживаемый обратный диапазон: 22.09.1792…22.09.1806 по григорианскому календарю.
ВозвратЦелый JDN; 0 для значений вне базовых диапазонов.
Ошибки и границыНенулевой JDN не доказывает правильность дня в коротком 13-м месяце. Перед сохранением проверяйте длину и обратное преобразование.
Путь первого преобразования
  1. 1-й день 1-го месяца года I
  2. frenchtojd → 2375840
  3. jdtogregorian → 9/22/1792
Прочитать начало календаряСамостоятельный пример
<?php
echo frenchtojd(1, 1, 1), "\n";
echo jdtogregorian(frenchtojd(1, 1, 1)), "\n";
Ожидаемый результат
2375840
9/22/1792

Год I записывается числом 1; перевод римских цифр из скана — отдельный этап импорта.

Проверить дополнительный день архивной записиСамостоятельный пример
<?php
$year = 3;
$day = 6;
if ($day <= cal_days_in_month(CAL_FRENCH, 13, $year)) {
    echo jdtogregorian(frenchtojd(13, $day, $year)), "\n";
}
echo cal_days_in_month(CAL_FRENCH, 13, 14), "\n";
echo jdtofrench(frenchtojd(13, 6, 14)), "\n";
Ожидаемый результат
9/22/1795
5
0/0/0

Шестой дополнительный день допустим в году III, но не XIV. Во втором случае прямой расчёт даёт число за поддерживаемой обратной границей: проверка нужна до импорта.

Применение и ограничения. Расширение намеренно не моделирует произвольное продолжение этого календаря после года XIV. Не используйте его для выдуманного «республиканского 2026 года».

Сравните jdtofrench, cal_days_in_month, cal_to_jd. Как выбирать календарь.

jewishtojdДля календаря мероприятий нужна дата 1 тишрея 5785: преобразуем её в 3 октября 2024 для обычного списка событий.

PHP 4+ · calendar

jewishtojd(int $month, int $day, int $year): int

Для календаря мероприятий нужна дата 1 тишрея 5785: преобразуем её в 3 октября 2024 для обычного списка событий.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

[...] создаёт массив; $info["year"] читает поле по ключу; foreach ($items as $item) последовательно берёт элементы. Ключи и значения.

Часть договораСмысл
month1…13: 1 Tishri, 13 Elul. В обычном году 6/7 обозначают Adar; в високосном 6 Adar I, 7 Adar II.
day1…30. В 29-дневном месяце день 30 переносится в следующий месяц.
yearДокументировано 1…9999, отсчёт от 3761 до н. э. Очень большие int дополнительно ограничены реализацией.
ВозвратЦелый JDN; недопустимые базовые значения дают 0.
Ошибки и границыНе считайте 6 и 7 двумя самостоятельными месяцами обычного года. Имена и длины зависят от года; формула не реконструирует древние наблюдения новой луны.
Путь первого преобразования
  1. Месяц 1, день 1, год 5785
  2. jewishtojd создаёт JDN
  3. jdtogregorian возвращает 10/3/2024
Связать дату мероприятия с григорианским спискомСамостоятельный пример
<?php
$jd = jewishtojd(1, 1, 5785);
echo jdtogregorian($jd), "\n";
echo jdtojewish($jd), "\n";
Ожидаемый результат
10/3/2024
1/1/5785

Исходную календарную систему сохраняют рядом с исходной датой; один григорианский результат не описывает правило ежегодного повторения.

Увидеть нумерацию Adar в обычном и високосном годуСамостоятельный пример
<?php
foreach ([5780, 5784] as $year) {
    foreach ([6, 7] as $month) {
        $jd = jewishtojd($month, 1, $year);
        echo jdtojewish($jd), ': ', jdmonthname($jd, CAL_MONTH_JEWISH), "\n";
    }
}
Ожидаемый результат
7/1/5780: Adar
7/1/5780: Adar
6/1/5784: Adar I
7/1/5784: Adar II

Два foreach означают: сначала год, внутри него два номера месяца. Канонический обратный результат обычного года использует 7; уменьшать все номера на один было бы ошибкой.

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

Сравните jdtojewish, jdmonthname, cal_days_in_month. Как выбирать календарь.

jdtogregorianПолучить григорианскую запись уже известного номера дня — для подписи записи в архиве.

PHP 4+ · calendar

jdtogregorian(int $julian_day): string

Получить григорианскую запись уже известного номера дня — для подписи записи в архиве.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

[...] создаёт массив; $info["year"] читает поле по ключу; foreach ($items as $item) последовательно берёт элементы. Ключи и значения.

Часть договораСмысл
julian_dayЦелый номер общего дня; без часа, минут и часового пояса. Строка удобна для диагностики, но для ISO-поля отчёта лучше cal_from_jd: не путайте месяц с днём.
ВозвратСтрока month/day/year без ведущих нулей. Это не массив и не DateTime.
Ошибки и границыДля дня вне поддерживаемого конкретным календарём диапазона возвращается строка "0/0/0" (проверено PHP 8.5.11), а не исключение. Не показывайте её как действительную дату.

В прикладном опыте sprintf собирает строку по шаблону: %04d — целое с четырьмя цифрами, %02d — с двумя и ведущим нулём. Оно только форматирует, а не проверяет дату.

Путь первого преобразования
  1. 2460477 — уже известный JDN
  2. jdtogregorian преобразует календарные компоненты
  3. 6/15/2024 — строка месяц/день/год
Получить календарную подписьСамостоятельный пример
<?php
$date = jdtogregorian(2460477);
echo $date, "\n";
Ожидаемый результат
6/15/2024

Один аргумент — номер дня. Результат подписывает тот же день в выбранной системе.

Проверить формат и границу использованияСамостоятельный пример
<?php
$jd = gregoriantojd(6, 15, 2024);
$parts = cal_from_jd($jd, CAL_GREGORIAN);
echo sprintf('%04d-%02d-%02d', $parts['year'], $parts['month'], $parts['day']), "\n";
echo jdtogregorian(0), "\n";
Ожидаемый результат
2024-06-15
0/0/0

Строка удобна для диагностики, но для ISO-поля отчёта лучше cal_from_jd: не путайте месяц с днём.

Применение и ограничения. Строка удобна для диагностики, но для ISO-поля отчёта лучше cal_from_jd: не путайте месяц с днём. Для проверки импортируемой даты сопоставляйте обратные компоненты с исходными; преобразование само по себе не является универсальной валидацией.

Сравните gregoriantojd, cal_from_jd. Как выбирать календарь.

jdtojulianПолучить юлианскую запись уже известного номера дня — для подписи записи в архиве.

PHP 4+ · calendar

jdtojulian(int $julian_day): string

Получить юлианскую запись уже известного номера дня — для подписи записи в архиве.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

Часть договораСмысл
julian_dayЦелый номер общего дня; без часа, минут и часового пояса. Это старый стиль; имя jdtojulian не означает получение JDN. Результат — три календарных компонента в строке.
ВозвратСтрока month/day/year без ведущих нулей. Это не массив и не DateTime.
Ошибки и границыДля дня вне поддерживаемого конкретным календарём диапазона возвращается строка "0/0/0" (проверено PHP 8.5.11), а не исключение. Не показывайте её как действительную дату.
Путь первого преобразования
  1. 2460477 — уже известный JDN
  2. jdtojulian преобразует календарные компоненты
  3. 6/2/2024 — строка месяц/день/год
Получить календарную подписьСамостоятельный пример
<?php
$date = jdtojulian(2460477);
echo $date, "\n";
Ожидаемый результат
6/2/2024

Один аргумент — номер дня. Результат подписывает тот же день в выбранной системе.

Проверить формат и границу использованияСамостоятельный пример
<?php
echo jdtojulian(gregoriantojd(1, 7, 2024)), "\n";
echo jdtojulian(gregoriantojd(1, 7, 2101)), "\n";
echo jdtojulian(0), "\n";
Ожидаемый результат
12/25/2023
12/24/2100
0/0/0

Это старый стиль; имя jdtojulian не означает получение JDN. Результат — три календарных компонента в строке.

Применение и ограничения. Это старый стиль; имя jdtojulian не означает получение JDN. Результат — три календарных компонента в строке. Для проверки импортируемой даты сопоставляйте обратные компоненты с исходными; преобразование само по себе не является универсальной валидацией.

Сравните juliantojd, cal_from_jd. Как выбирать календарь.

jdtofrenchПолучить французскую республиканскую запись уже известного номера дня — для подписи записи в архиве.

PHP 4+ · calendar

jdtofrench(int $julian_day): string

Получить французскую республиканскую запись уже известного номера дня — для подписи записи в архиве.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

Часть договораСмысл
julian_dayЦелый номер общего дня; без часа, минут и часового пояса. Результат доступен только для JDN 2375840…2380952 (годы I…XIV). Современная дата даст 0/0/0.
ВозвратСтрока month/day/year без ведущих нулей. Это не массив и не DateTime.
Ошибки и границыДля дня вне поддерживаемого конкретным календарём диапазона возвращается строка "0/0/0" (проверено PHP 8.5.11), а не исключение. Не показывайте её как действительную дату.
Путь первого преобразования
  1. 2375840 — уже известный JDN
  2. jdtofrench преобразует календарные компоненты
  3. 1/1/1 — строка месяц/день/год
Получить календарную подписьСамостоятельный пример
<?php
$date = jdtofrench(2375840);
echo $date, "\n";
Ожидаемый результат
1/1/1

Один аргумент — номер дня. Результат подписывает тот же день в выбранной системе.

Проверить формат и границу использованияСамостоятельный пример
<?php
echo jdtofrench(2380952), "\n";
echo jdtofrench(2380953), "\n";
echo jdtofrench(gregoriantojd(6, 15, 2024)), "\n";
Ожидаемый результат
13/5/14
0/0/0
0/0/0

Результат доступен только для JDN 2375840…2380952 (годы I…XIV). Современная дата даст 0/0/0.

Применение и ограничения. Результат доступен только для JDN 2375840…2380952 (годы I…XIV). Современная дата даст 0/0/0. Для проверки импортируемой даты сопоставляйте обратные компоненты с исходными; преобразование само по себе не является универсальной валидацией.

Сравните frenchtojd, cal_from_jd. Как выбирать календарь.

jdtojewishСписок событий может показать числовую еврейскую дату или подпись буквами. Выберем формат явно, чтобы однобайтный текст не испортил UTF-8 страницу.

PHP 4+ · calendar

jdtojewish(int $julian_day, bool $hebrew = false, int $flags = 0): string

Список событий может показать числовую еврейскую дату или подпись буквами. Выберем формат явно, чтобы однобайтный текст не испортил UTF-8 страницу.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

try выполняет попытку; catch (ValueError $error) обрабатывает недопустимое значение. Это не проверка текстовой формы: внешнюю строку сначала разбирают и проверяют. Исключения; Безопасный приём формы.

Часть договораСмысл
julian_dayЦелый JDN.
hebrewfalse: числовая строка month/day/year; true: еврейские буквы в ISO-8859-8, не UTF-8.
flagsБитовая комбинация CAL_JEWISH_ADD_ALAFIM_GERESH, CAL_JEWISH_ADD_ALAFIM, CAL_JEWISH_ADD_GERESHAYIM; применяется к буквенной форме.
ВозвратСтрока выбранного представления. Числовая форма нужна для идентификаторов и расчётов.
Ошибки и границыВне диапазона числовая форма может дать 0/0/0, буквенная для года вне 1…9999 бросает ValueError. Не отдавайте сырые ISO-8859-8 байты в UTF-8 HTML/JSON.

Перед вторым опытом: mb_convert_encoding перекодирует байты; имена кодировок в кавычках — её аргументы. Строка, байты и кодировка.

Путь первого преобразования
  1. JDN дня 3 октября 2024
  2. hebrew=false выбирает числовую запись
  3. 1/1/5785 — первое тишрея
Получить дату без проблемы кодировкиСамостоятельный пример
<?php
$jd = gregoriantojd(10, 3, 2024);
echo jdtojewish($jd), "\n";
echo jdmonthname($jd, CAL_MONTH_JEWISH), "\n";
Ожидаемый результат
1/1/5785
Tishri

Календарная запись меняется; часовой пояс не рассчитывается.

Подготовить буквенную подпись для UTF-8 страницыСамостоятельный пример
<?php
$jd = gregoriantojd(10, 3, 2024);
$flags = CAL_JEWISH_ADD_ALAFIM_GERESH | CAL_JEWISH_ADD_GERESHAYIM;
$bytes = jdtojewish($jd, true, $flags);
$text = mb_convert_encoding($bytes, 'UTF-8', 'ISO-8859-8');
echo $text, "\n";
Ожидаемый результат
א' תשרי ה'תשפ"ה

Для этого опыта нужно расширение mbstring. | объединяет независимые флаги. Конвертация исправляет кодировку, но HTML-экранирование при вставке текста в разметку всё равно нужно.

Различить два поведения за пределами диапазонаСамостоятельный пример
<?php
echo jdtojewish(0), "\n";
try { jdtojewish(0, true); }
catch (ValueError $error) { echo "no Hebrew date\n"; }
Ожидаемый результат
0/0/0
no Hebrew date

Вариант представления влияет не только на внешний вид, но и на поведение при ошибке.

Применение и ограничения. Флаги: ALAFIM_GERESH добавляет знак после тысяч, ALAFIM — слово «тысяч», GERESHAYIM — знаки в записи дня и года. Буквенная запись не уникальный ключ данных; храните числовые компоненты. Полная таблица констант.

Сравните jewishtojd, cal_from_jd, jdmonthname. Как выбирать календарь.

cal_days_in_monthФорма расписания должна разрешить 29 февраля в 2024 году, но только 28 дней в 2023. Длину месяца вычисляет выбранный календарь.

PHP 4.1+ · calendar

cal_days_in_month(int $calendar, int $month, int $year): int

Форма расписания должна разрешить 29 февраля в 2024 году, но только 28 дней в 2023. Длину месяца вычисляет выбранный календарь.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

if (условие) { ... } выполняет выбранную ветку. function name($value) { ... } объявляет повторяемое действие; return отдаёт результат вызывающему коду. === сравнивает также тип. Параметр, вызов, результат.

try выполняет попытку; catch (ValueError $error) обрабатывает недопустимое значение. Это не проверка текстовой формы: внешнюю строку сначала разбирают и проверяют. Исключения; Безопасный приём формы.

Часть договораСмысл
calendarCAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH или CAL_FRENCH.
month / yearНомер месяца и год именно в выбранной системе. Для григорианского календаря месяц 1…12.
ВозвратЧисло дней. В обычном еврейском году технический слот 6 (Adar I) имеет 0 дней, потому что используется слот 7 (Adar).
Ошибки и границыНекорректный calendar или невозможная дата дают ValueError в PHP 8.5.11; функция не принимает имя месяца. Крайние int ограничены реализацией.
Путь первого преобразования
  1. Григорианский февраль 2024
  2. cal_days_in_month(CAL_GREGORIAN, 2, 2024)
  3. 29 допустимых номеров дня
Узнать длину выбранного месяцаСамостоятельный пример
<?php
echo cal_days_in_month(CAL_GREGORIAN, 2, 2024), "\n";
echo cal_days_in_month(CAL_GREGORIAN, 2, 2023), "\n";
Ожидаемый результат
29
28

Месяц начинается с 1. Не переносите нумерацию массива JavaScript 0…11 прямо в этот вызов.

Проверить выбранный день перед созданием записиСамостоятельный пример
<?php
function acceptsDay($month, $day, $year) {
    if ($year < 1 || $year > 9999 || $month < 1 || $month > 12) {
        return false;
    }
    return $day >= 1 && $day <= cal_days_in_month(CAL_GREGORIAN, $month, $year);
}
var_dump(acceptsDay(2, 29, 2024), acceptsDay(2, 29, 2023), acceptsDay(0, 1, 2024));
Ожидаемый результат
bool(true)
bool(false)
bool(false)

&& требует обе границы. Здесь аргументы уже целые из доверенного кода; строки $_POST сначала проверяют отдельно. Для этого же григорианского условия проще checkdate.

Не рисовать отсутствующий месяцСамостоятельный пример
<?php
echo cal_days_in_month(CAL_JEWISH, 6, 5780), "\n";
echo cal_days_in_month(CAL_JEWISH, 7, 5780), "\n";
try { cal_days_in_month(CAL_GREGORIAN, 13, 2024); }
catch (ValueError $error) { echo "invalid month\n"; }
Ожидаемый результат
0
29
invalid month

Виджет еврейского календаря не должен создавать пустой месяц только потому, что справочник содержит 13 названий.

Применение и ограничения. Для григорианского DateTime объектный format("t") тоже возвращает длину месяца, но строкой и уже для даты объекта. Ни один вариант не вычисляет число рабочих смен, праздники или остаток дней до 27-го числа.

Сравните cal_info, cal_to_jd, jewishtojd. Как выбирать календарь.

cal_infoНужен список поддерживаемых календарей и названия месяцев для административной формы. Получим метаданные, а не дату «сегодня».

PHP 4.1+ · calendar

cal_info(int $calendar = -1): array

Нужен список поддерживаемых календарей и названия месяцев для административной формы. Получим метаданные, а не дату «сегодня».

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

[...] создаёт массив; $info["year"] читает поле по ключу; foreach ($items as $item) последовательно берёт элементы. Ключи и значения.

Часть договораСмысл
calendarКонкретная CAL_* система. −1 или отсутствие аргумента возвращает все четыре; другие недопустимые ID дают ValueError.
ВозвратМассив: months, abbrevmonths (ключи месяцев от 1), maxdaysinmonth, calname, calsymbol. В режиме −1 внешний массив индексирован ID календарей.
Ошибки и границыИмена полей именно months/abbrevmonths, во множественном числе. Метаданные не знают выбранный год: Adar и реальные длины надо уточнять отдельно.
Путь первого преобразования
  1. CAL_GREGORIAN
  2. cal_info читает описание календаря
  3. months[2] → February; maxdaysinmonth → 31
Прочитать одно поле справочникаСамостоятельный пример
<?php
$info = cal_info(CAL_GREGORIAN);
echo $info['months'][2], "\n";
echo $info['maxdaysinmonth'], "\n";
Ожидаемый результат
February
31

Два набора [] означают: сначала поле months, затем месяц 2. Максимум 31 не означает, что каждый месяц имеет 31 день.

Собрать варианты формы без выдуманных IDСамостоятельный пример
<?php
foreach (cal_info() as $id => $info) {
    echo $id, ': ', $info['calname'], ' / ', $info['calsymbol'], "\n";
}
Ожидаемый результат
0: Gregorian / CAL_GREGORIAN
1: Julian / CAL_JULIAN
2: Jewish / CAL_JEWISH
3: French / CAL_FRENCH

В foreach запись $id => $info получает ключ и значение. Названия возвращаются по-английски; русский интерфейс использует свою таблицу подписей.

Применение и ограничения. Не используйте cal_info как локализатор и не считайте maxdaysinmonth валидатором конкретной даты. Справочник можно получать один раз при построении формы; повторный вызов для каждой ячейки ничего не добавляет.

Сравните cal_days_in_month, jdmonthname, cal_from_jd. Как выбирать календарь.

cal_to_jdИмпорт принимает календарную систему отдельным полем. Один общий вызов позволяет преобразовать выбранную систему без четырёх разных веток.

PHP 4.1+ · calendar

cal_to_jd(int $calendar, int $month, int $day, int $year): int

Импорт принимает календарную систему отдельным полем. Один общий вызов позволяет преобразовать выбранную систему без четырёх разных веток.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

[...] создаёт массив; $info["year"] читает поле по ключу; foreach ($items as $item) последовательно берёт элементы. Ключи и значения.

try выполняет попытку; catch (ValueError $error) обрабатывает недопустимое значение. Это не проверка текстовой формы: внешнюю строку сначала разбирают и проверяют. Исключения; Безопасный приём формы.

Часть договораСмысл
calendarCAL_GREGORIAN / CAL_JULIAN / CAL_JEWISH / CAL_FRENCH.
month, day, yearВ этом порядке, с диапазонами выбранного календаря; смотрите карту диапазонов.
ВозвратЦелый JDN. В пределах допустимых машинных аргументов невозможная дата может дать 0 либо нормализоваться по правилам календаря.
Ошибки и границыНеверный calendar даёт ValueError. В PHP 8.5.11 month должен быть 1…2147483646, day — signed 32-bit, year не выше 2147483646; это лишь технические пределы, не разрешённые календарные даты.
Путь первого преобразования
  1. Источник сообщает CAL_JULIAN и 6/2/2024
  2. cal_to_jd учитывает выбранную систему
  3. 2460477 → одна строка в календарном индексе
Передать календарь первым аргументомСамостоятельный пример
<?php
echo cal_to_jd(CAL_JULIAN, 6, 2, 2024), "\n";
echo cal_to_jd(CAL_GREGORIAN, 6, 15, 2024), "\n";
Ожидаемый результат
2460477
2460477

Системы разные, но обе записи обозначают один день.

Не спутать расчёт с проверкой импортируемой датыСамостоятельный пример
<?php
$calendar = CAL_GREGORIAN;
$month = 2; $day = 31; $year = 2024;
$jd = cal_to_jd($calendar, $month, $day, $year);
$actual = cal_from_jd($jd, $calendar);
var_dump($actual['month'] === $month && $actual['day'] === $day && $actual['year'] === $year);
try { cal_to_jd(99, 1, 1, 2024); }
catch (ValueError $error) { echo "unknown calendar\n"; }
Ожидаемый результат
bool(false)
unknown calendar

Обратные компоненты выявляют нормализацию. Для Jewish Adar сначала определите допустимую канонизацию 6/7, иначе намеренно равнозначный ввод будет отвергнут.

Применение и ограничения. Когда система фиксирована, gregoriantojd или другая специализированная функция делает намерение заметнее. Общий вызов полезен на границе импорта, где тип календаря — часть данных.

Сравните cal_from_jd, gregoriantojd, juliantojd, frenchtojd, jewishtojd. Как выбирать календарь.

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

PHP 4.1+ · calendar

cal_from_jd(int $julian_day, int $calendar): array

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

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

[...] создаёт массив; $info["year"] читает поле по ключу; foreach ($items as $item) последовательно берёт элементы. Ключи и значения.

Часть договораСмысл
julian_dayЦелый общий номер дня.
calendarЦелевая система: одна из четырёх CAL_* констант.
ВозвратМассив date, month, day, year, dow, abbrevdayname, dayname, abbrevmonth, monthname. date имеет вид month/day/year; dow 0=Sunday…6=Saturday.
Ошибки и границыНеверный calendar — ValueError. Вне диапазона календаря date может стать 0/0/0; для недоступной Jewish даты dow=null и названия пустые (8.5.11). Наличие массива не доказывает успех.
Путь первого преобразования
  1. 2460477 + CAL_GREGORIAN
  2. cal_from_jd раскладывает день на поля
  3. day=15, month=6, year=2024; dayname=Saturday
Прочитать поля датыСамостоятельный пример
<?php
$date = cal_from_jd(2460477, CAL_GREGORIAN);
echo $date['day'], '.', $date['month'], '.', $date['year'], "\n";
echo $date['dayname'], "\n";
Ожидаемый результат
15.6.2024
Saturday

Имя поля — строковый ключ массива; это не свойство объекта.

Один день — две карточки представленияСамостоятельный пример
<?php
foreach ([CAL_GREGORIAN, CAL_JULIAN] as $calendar) {
    $date = cal_from_jd(2460477, $calendar);
    echo $date['date'], ' / ', $date['dow'], "\n";
}
$missing = cal_from_jd(0, CAL_JEWISH);
echo $missing['date'], "\n";
var_dump($missing['dow']);
Ожидаемый результат
6/15/2024 / 6
6/2/2024 / 6
0/0/0
NULL

Названия даты меняются, день недели одного дня сохраняется. Проверка year/day до отображения предотвращает фиктивную нулевую дату.

Применение и ограничения. Нужна только готовая подпись — используйте jdtogregorian и родственников. Нужны поля для CSV/API — этот массив позволяет избежать неоднозначного повторного парсинга.

Сравните cal_to_jd, jdtogregorian, jddayofweek, jdmonthname. Как выбирать календарь.

jddayofweekРасписание должно узнать, является ли выбранный день воскресеньем. Номер дня недели удобнее локализованного текста.

PHP 4+ · calendar

jddayofweek(int $julian_day, int $mode = CAL_DOW_DAYNO): int|string

Расписание должно узнать, является ли выбранный день воскресеньем. Номер дня недели удобнее локализованного текста.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

[...] создаёт массив; $info["year"] читает поле по ключу; foreach ($items as $item) последовательно берёт элементы. Ключи и значения.

if (условие) { ... } выполняет выбранную ветку. function name($value) { ... } объявляет повторяемое действие; return отдаёт результат вызывающему коду. === сравнивает также тип. Параметр, вызов, результат.

Часть договораСмысл
julian_dayЦелый JDN.
modeCAL_DOW_DAYNO=0: число 0…6; CAL_DOW_LONG=1: полное английское имя; CAL_DOW_SHORT=2: сокращение.
Возвратint только в числовом режиме; в двух текстовых string. 0 — воскресенье, 6 — суббота.
Ошибки и границыНе путайте этот индекс с ISO-неделей 1…7 от понедельника. Неизвестный mode в PHP 8.5.11 возвращает числовой режим, а не исключение: используйте известные константы.
Путь первого преобразования
  1. 2460477: 15 июня 2024
  2. jddayofweek(..., CAL_DOW_DAYNO)
  3. 6: суббота
Выбрать числовой или текстовый ответСамостоятельный пример
<?php
$jd = gregoriantojd(6, 15, 2024);
echo jddayofweek($jd), "\n";
echo jddayofweek($jd, CAL_DOW_LONG), "\n";
echo jddayofweek($jd, CAL_DOW_SHORT), "\n";
Ожидаемый результат
6
Saturday
Sat

В базе расписания удобен согласованный номер, в интерфейсе — отдельная переводимая подпись.

Собрать русскую подпись и правило выходногоСамостоятельный пример
<?php
$labels = ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'];
$day = jddayofweek(gregoriantojd(6, 16, 2024));
echo $labels[$day], "\n";
if ($day === 0 || $day === 6) { echo "weekend rule\n"; }
Ожидаемый результат
Вс
weekend rule

|| означает «хотя бы одно условие». Правило выходного принадлежит приложению: отдельная организация может работать в субботу.

Применение и ограничения. Не сравнивайте английскую строку с русским названием. JDN без часового пояса сначала должен быть получен именно из местной календарной даты события.

Сравните jdmonthname, cal_from_jd, unixtojd. Как выбирать календарь.

jdmonthnameАрхиву нужен месяц в выбранной календарной системе. У одного дня это может быть Gregorian July и Julian June.

PHP 4+ · calendar

jdmonthname(int $julian_day, int $mode): string

Архиву нужен месяц в выбранной календарной системе. У одного дня это может быть Gregorian July и Julian June.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

Часть договораСмысл
julian_dayЦелый JDN.
modeОдин из шести CAL_MONTH_* режимов: Gregorian/Julian SHORT/LONG, JEWISH или FRENCH. mode обязателен.
ВозвратНазвание месяца: английское или латинская транслитерация. Это не перевод по языку сайта.
Ошибки и границыНе передавайте CAL_JULIAN вместо CAL_MONTH_JULIAN_LONG: числовые значения семейств пересекаются, смысл различается. За диапазоном может получиться пустая строка; неизвестный mode в 8.5.11 ведёт к Gregorian short.
Путь первого преобразования
  1. 1 июля 2024 → JDN
  2. CAL_MONTH_JULIAN_LONG выбирает другой календарь
  3. June: в нём ещё июнь
Увидеть месяцы одного и того же дняСамостоятельный пример
<?php
$jd = gregoriantojd(7, 1, 2024);
echo jdmonthname($jd, CAL_MONTH_GREGORIAN_LONG), "\n";
echo jdmonthname($jd, CAL_MONTH_JULIAN_LONG), "\n";
Ожидаемый результат
July
June

Функция сама переводит номер дня в выбранную систему, затем выбирает подпись.

Подписать еврейскую и республиканскую записиСамостоятельный пример
<?php
echo jdmonthname(jewishtojd(6, 1, 5784), CAL_MONTH_JEWISH), "\n";
echo jdmonthname(jewishtojd(7, 1, 5784), CAL_MONTH_JEWISH), "\n";
echo jdmonthname(frenchtojd(13, 1, 3), CAL_MONTH_FRENCH), "\n";
Ожидаемый результат
Adar I
Adar II
Extra

В еврейском календаре имя зависит от високосности года; у French 13-й период назван Extra.

Применение и ограничения. Gregorian/Julian SHORT: Jan…Dec; LONG: January…December. Jewish: Tishri, Heshvan, Kislev, Tevet, Shevat, Adar / Adar I / Adar II, Nisan, Iyyar, Sivan, Tammuz, Av, Elul. French: Vendemiaire, Brumaire, Frimaire, Nivose, Pluviose, Ventose, Germinal, Floreal, Prairial, Messidor, Thermidor, Fructidor, Extra. Полный словарь для формы можно получить через cal_info.

Сравните cal_info, jddayofweek, cal_from_jd. Как выбирать календарь.

jdtounixПосле календарного преобразования нужен timestamp для начала конкретного дня UTC. Здесь начало — полночь, хотя астрономический Julian Date часто связан с полуднем.

PHP 4+ · calendar

jdtounix(int $julian_day): int

После календарного преобразования нужен timestamp для начала конкретного дня UTC. Здесь начало — полночь, хотя астрономический Julian Date часто связан с полуднем.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

try выполняет попытку; catch (ValueError $error) обрабатывает недопустимое значение. Это не проверка текстовой формы: внешнюю строку сначала разбирают и проверяют. Исключения; Безопасный приём формы.

Часть договораСмысл
julian_day2440588…106751993607888 на 64-bit; 2440588…2465443 на 32-bit. Минимум — 1970-01-01.
ВозвратUnix timestamp полуночи UTC: целые секунды, без долей. Не полночь местного региона.
Ошибки и границыВне диапазона ValueError с PHP 8.0; раньше false. В 7.3.24/7.4.12 верхняя граница расширена; раньше 2465342 на всех архитектурах.

gmdate("Y-m-d H:i", $timestamp) выбирает год-месяц-день и часы:минуты в UTC. Значения букв формата.

Путь первого преобразования
  1. JDN 2440589
  2. На один день позже Unix epoch
  3. 86400 секунд → 1970-01-02 00:00 UTC
Получить начало дня UTCСамостоятельный пример
<?php
echo jdtounix(2440589), "\n";
echo gmdate('Y-m-d H:i', jdtounix(2440589)), "\n";
Ожидаемый результат
86400
1970-01-02 00:00

gmdate форматирует в UTC. Эта подпись не зависит от PHP timezone.

Не превращать древнюю дату в допустимый timestamp этой функцииСамостоятельный пример
<?php
try { jdtounix(gregoriantojd(12, 31, 1969)); }
catch (ValueError $error) { echo "before supported epoch\n"; }
$jd = gregoriantojd(6, 15, 2024);
echo gmdate('Y-m-d H:i', jdtounix($jd)), "\n";
Ожидаемый результат
before supported epoch
2024-06-15 00:00

DateTime может работать с отрицательными timestamp, но контракт jdtounix уже. Не переносите возможность одного API на другое.

Применение и ограничения. Необратимость с unixtojd двоякая: время суток теряется, а та функция использует локальную системную дату. Для полуночи конкретного региона соберите DateTimeImmutable с явным DateTimeZone.

Сравните unixtojd, gregoriantojd. Как выбирать календарь.

unixtojdСервису нужен только календарный день из timestamp. Функция отбрасывает время суток по локальной системной зоне; этот выбор нужно знать до группировки событий.

PHP 4+ · calendar

unixtojd(?int $timestamp = null): int|false

Сервису нужен только календарный день из timestamp. Функция отбрасывает время суток по локальной системной зоне; этот выбор нужно знать до группировки событий.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

try выполняет попытку; catch (ValueError $error) обрабатывает недопустимое значение. Это не проверка текстовой формы: внешнюю строку сначала разбирают и проверяют. Исключения; Безопасный приём формы.

new DateTimeImmutable(...) создаёт объект даты; new DateTimeZone(...) задаёт регион. -> вызывает его метод. Изменения immutable возвращают новый объект, поэтому результат сохраняют. Сначала дата, момент и зона.

Часть договораСмысл
timestampНеотрицательные целые секунды Unix. Отсутствие аргумента/null означает текущий момент. С PHP 8.0 аргумент nullable.
ВозвратЦелый JDN местного дня либо false, если системная библиотека не может преобразовать момент.
Ошибки и границыОтрицательное значение в PHP 8.5.11 даёт ValueError. Реализация использует C localtime и системное TZ; date_default_timezone_set не является настройкой этой операции. Большие значения зависят от time_t/C библиотеки.
Путь первого преобразования
  1. Системная зона UTC; timestamp 100000
  2. unixtojd извлекает местную дату 1970-01-02
  3. 2440589: часы и минуты утрачены
Явно зафиксировать системную зону учебного процессаСамостоятельный пример
<?php
putenv('TZ=UTC0');
echo unixtojd(100000), "\n";
echo jdtounix(unixtojd(100000)), "\n";
Ожидаемый результат
2440589
86400

putenv задаёт переменную окружения только процесса. Опыт проверен с C runtime Windows PHP 8.5.11. 100000 секунд не восстанавливаются: осталась полночь дня.

Показать разницу системного TZ и PHP timezoneСамостоятельный пример
<?php
putenv('TZ=EST5');
date_default_timezone_set('UTC');
echo jdtogregorian(unixtojd(0)), "\n";
echo gmdate('Y-m-d', 0), "\n";
try { unixtojd(-1); }
catch (ValueError $error) { echo "negative timestamp rejected\n"; }
Ожидаемый результат
12/31/1969
1970-01-01
negative timestamp rejected

EST5 здесь фиксирует UTC−5 без летнего перехода как системную POSIX-зону учебного процесса. Несмотря на PHP UTC, системный местный день ещё предыдущий. Этот код не меняет часы компьютера.

Взять день именно из зоны объектаСамостоятельный пример
<?php
$moment = new DateTimeImmutable('1970-01-01 00:00:00 UTC');
$local = $moment->setTimezone(new DateTimeZone('America/New_York'));
$jd = gregoriantojd((int) $local->format('n'), (int) $local->format('j'), (int) $local->format('Y'));
echo jdtogregorian($jd), "\n";
Ожидаемый результат
12/31/1969

Когда задача привязана к региону клиента, явные компоненты объекта исключают скрытую системную зону. (int) превращает цифровую строку формата в целое, не разбирает произвольный ввод пользователя.

Применение и ограничения. Для изолированного примера изменение TZ допустимо; в многозадачном серверном коде не переключайте окружение ради каждого клиента. Для клиентского дня предпочтительнее DateTime с зоной и gregoriantojd. Сравнение разницы JDN считает переходы календарной даты, а не полные 24 часа.

Сравните jdtounix, gregoriantojd, cal_from_jd. Как выбирать календарь.

easter_daysДля расписания праздника достаточно узнать отступ от 21 марта в выбранном календаре. В 2024 григорианский отступ 10 дней даёт 31 марта.

PHP 4+ · calendar

easter_days(?int $year = null, int $mode = CAL_EASTER_DEFAULT): int

Для расписания праздника достаточно узнать отступ от 21 марта в выбранном календаре. В 2024 григорианский отступ 10 дней даёт 31 марта.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

if (условие) { ... } выполняет выбранную ветку. function name($value) { ... } объявляет повторяемое действие; return отдаёт результат вызывающему коду. === сравнивает также тип. Параметр, вызов, результат.

new DateTimeImmutable(...) создаёт объект даты; new DateTimeZone(...) задаёт регион. -> вызывает его метод. Изменения immutable возвращают новый объект, поэтому результат сохраняют. Сначала дата, момент и зона.

Часть договораСмысл
yearПоложительный год; null/пропуск берёт текущий по системному местному времени. Nullable с PHP 8.0. Не ограничен диапазоном timestamp easter_date.
modeDEFAULT: Julian до 1753, Gregorian с 1753; ROMAN: переход с 1583; ALWAYS_GREGORIAN / ALWAYS_JULIAN — всегда выбранная система.
ВозвратЦелое число дней после 21 марта в системе расчёта. Не месяц/день и не Unix timestamp.
Ошибки и границыВ PHP 8.5.11 неположительный год или год выше 4×intdiv(PHP_INT_MAX,5) даёт ValueError. Это технический предел, не обещание исторической достоверности. Выбирайте только известные mode.

Расчёт основан на церковном календарном алгоритме: условное равноденствие 21 марта, табличная луна и следующее воскресенье. Это не наблюдение реального астрономического полнолуния. Исторический алгоритм восходит к VI веку; григорианская ветка добавляет поправки к 19-летнему циклу. Четыре режима и границы истории.

Путь первого преобразования
  1. Год 2024; CAL_EASTER_ALWAYS_GREGORIAN
  2. easter_days возвращает 10
  3. 21 марта + 10 дней → 31 марта
Получить число дней, не timestampСамостоятельный пример
<?php
echo easter_days(2024, CAL_EASTER_ALWAYS_GREGORIAN), "\n";
echo easter_days(2024, CAL_EASTER_ALWAYS_JULIAN), "\n";
Ожидаемый результат
10
32

Второй отступ относится к юлианскому 21 марта. Нельзя прибавить его к григорианскому 21 марта и назвать результат переводом старого стиля.

Сопоставить две календарные традиции через JDNСамостоятельный пример
<?php
$western = gregoriantojd(3, 21, 2024) + easter_days(2024, CAL_EASTER_ALWAYS_GREGORIAN);
$julianRule = juliantojd(3, 21, 2024) + easter_days(2024, CAL_EASTER_ALWAYS_JULIAN);
echo jdtogregorian($western), "\n";
echo jdtogregorian($julianRule), "\n";
Ожидаемый результат
3/31/2024
5/5/2024

Исходный 21 марта переводится своей функцией; затем прибавляется число календарных дней. Политика праздника конкретной организации всё равно задаётся ею.

Получить полночь праздника в зоне сайтаСамостоятельный пример
<?php
function holidayStart($year, $zone) {
    $base = new DateTimeImmutable($year . '-03-21 00:00:00', new DateTimeZone($zone));
    $days = easter_days($year, CAL_EASTER_ALWAYS_GREGORIAN);
    return $base->modify('+' . $days . ' days');
}
echo holidayStart(2024, 'Europe/Paris')->format('Y-m-d H:i P'), "\n";
Ожидаемый результат
2024-03-31 00:00 +01:00

Точка соединяет строки; правило создаётся из целого результата, а не непроверенного текста. На полуночи этого дня Париж ещё +01:00; перевод часов произойдёт позже.

Применение и ограничения. Для дат 1583…1752 DEFAULT и ROMAN различаются. Даже современный ALWAYS_JULIAN описывает алгоритм, а не весь набор конфессиональных исключений. Правило выбора календаря храните явно вместе с результатом.

Сравните easter_date, juliantojd, gregoriantojd. Как выбирать календарь.

easter_dateЕсли интеграция требует именно timestamp, функция возвращает системную местную полночь праздника. Для сайта с собственной зоной часто яснее easter_days плюс DateTime.

PHP 4+ · calendar

easter_date(?int $year = null, int $mode = CAL_EASTER_DEFAULT): int

Если интеграция требует именно timestamp, функция возвращает системную местную полночь праздника. Для сайта с собственной зоной часто яснее easter_days плюс DateTime.

Функция получает значения в круглых скобках, разделённые запятыми, и возвращает результат. $jd = gregoriantojd(6, 15, 2024);: $jd — переменная, = сохраняет результат, ; завершает команду. Порядок здесь месяц, день, год. echo выводит значение; "\n" — перенос строки. var_dump дополнительно показывает тип. Имена CAL_* без кавычек — встроенные целочисленные константы режима. Переменные; вызов функции.

В сигнатуре int — целое, string — текст, array — массив, bool — true/false. Знак ? перед типом разрешает null; | означает один из перечисленных типов. Значение после = — аргумент по умолчанию.

try выполняет попытку; catch (ValueError $error) обрабатывает недопустимое значение. Это не проверка текстовой формы: внешнюю строку сначала разбирают и проверяют. Исключения; Безопасный приём формы.

Часть договораСмысл
year1970…2037 на 32-bit; с PHP 8.3 на 64-bit допускается 1970…2000000000. До 8.3 также 2037. null/пропуск — текущий год системной местной даты; nullable с 8.0.
modeТе же четыре режима расчёта, что у easter_days. ALWAYS_JULIAN меняет вычисление отступа, но сам по себе не является полноценным переводом юлианской даты в григорианский timestamp.
Возвратint: timestamp по C mktime в системной TZ, не по date_default_timezone_set. Огромные принятые годы могут упереться в платформенную C-библиотеку; принятие аргумента не гарантирует переносимый timestamp.
Ошибки и границыНедопустимый год с PHP 8.0 даёт ValueError; раньше warning и false. Не используйте результат как дату клиента без согласования TZ.

Расчёт основан на церковном календарном алгоритме: условное равноденствие 21 марта, табличная луна и следующее воскресенье. Это не наблюдение реального астрономического полнолуния. Исторический алгоритм восходит к VI веку; григорианская ветка добавляет поправки к 19-летнему циклу. Четыре режима и границы истории.

Путь первого преобразования
  1. Системная TZ=UTC0; год 2024
  2. easter_date → timestamp 1711843200
  3. gmdate → 2024-03-31 00:00
Прочитать timestamp в согласованной зонеСамостоятельный пример
<?php
putenv('TZ=UTC0');
$timestamp = easter_date(2024);
echo $timestamp, "\n";
echo gmdate('Y-m-d H:i', $timestamp), "\n";
Ожидаемый результат
1711843200
2024-03-31 00:00

Локальная системная зона учебного процесса зафиксирована UTC. putenv не устанавливает PHP timezone; gmdate всё равно выводит UTC.

Воспроизвести источник ошибки «праздник накануне»Самостоятельный пример
<?php
putenv('TZ=UTC0');
date_default_timezone_set('America/New_York');
$timestamp = easter_date(2024);
echo date('Y-m-d H:i', $timestamp), "\n";
try { easter_date(1969); }
catch (ValueError $error) { echo "unsupported year\n"; }
Ожидаемый результат
2024-03-30 20:00
unsupported year

timestamp соответствует полуночи UTC, а date показывает его в PHP-зоне New York. Это один момент с двумя местными подписями, а не ошибка даты полнолуния.

Режим алгоритма не заменяет перевод календаряСамостоятельный пример
<?php
putenv('TZ=UTC0');
echo gmdate('Y-m-d', easter_date(2024, CAL_EASTER_ALWAYS_JULIAN)), "\n";
$jd = juliantojd(3, 21, 2024) + easter_days(2024, CAL_EASTER_ALWAYS_JULIAN);
echo jdtogregorian($jd), "\n";
Ожидаемый результат
2024-04-22
5/5/2024

На PHP 8.5.11 easter_date передаёт рассчитанные месяц/день системному mktime; тот не выполняет перевод юлианской даты в григорианскую. Для этого нужен второй явно показанный путь. Не называйте первый результат готовой датой православной Пасхи.

Применение и ограничения. d в формате означает день месяца, t — количество дней в месяце. Ошибка буквы может выглядеть как ошибка календарного алгоритма. Для региона пользователя используйте путь easter_days с явной зоной; для юлианского алгоритма выполните календарное преобразование через JDN, показанное в соседней карточке.

Сравните easter_days, jdtounix, juliantojd. Как выбирать календарь.

Источники и обсуждения

Код и руководство с собой

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

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.