Как конвертировать еврейскую дату в юлианскую в PHP
Узнайте, как использовать функцию jewishtojd() в PHP для преобразования еврейской даты в юлианский номер дня с примерами кода.
Функция PHP jewishtojd() преобразует дату по еврейскому (иврит) календарю в юлианский номер дня (Julian Day Count) — единственное целое число, однозначно идентифицирующее день. Поскольку юлианские номера дней являются календарно-нейтральными, они служат универсальным «мостом» для конвертации между календарными системами: преобразуйте еврейскую дату в юлианский номер дня, а затем конвертируйте это число в григорианскую дату (или любой другой поддерживаемый календарь). На этой странице объясняется принцип работы функции, её параметры и граничные случаи, а также приведены проверенные, готовые к запуску примеры.
Функции Calendar требуют расширения PHP
calendar. Оно поставляется с большинством сборок и включено по умолчанию в Windows; в Linux вам может потребоваться скомпилировать PHP с--with-calendarили установить пакет, напримерphp-calendar.
Что такое юлианский номер дня?
Юлианский номер дня (JDN) — это количество дней, прошедших с полудня (UTC) 1 января 4713 г. до н.э. по пролептическому юлианскому календарю. Не путайте его с юлианским календарём — несмотря на общее название, юлианский номер дня — это просто непрерывный счётчик дней без месяцев и лет.
JDN является форматом-мостом для расширения PHP calendar. Каждая функция *tojd() (jewishtojd(), gregoriantojd(), juliantojd(), frenchtojd()) возвращает JDN, а каждая функция jdto*() принимает его. Таким образом, все межкалендарные конвертации проходят через него:
Jewish date ──jewishtojd()──▶ JDN ──jdtogregorian()──▶ Gregorian dateСигнатура функции
jewishtojd(int $month, int $day, int $year): int| Параметр | Описание |
|---|---|
$month | Номер еврейского месяца, где 1 = Тишрей, а не январь (см. подводный камень ниже). Допустимый диапазон: 1–13. |
$day | День месяца, 1–30. |
$year | Еврейский год, отсчитываемый от традиционной даты сотворения мира (год 1 ≈ 3761 г. до н.э.). |
Функция возвращает юлианский номер дня как целое число или 0 для даты, выходящей за пределы поддерживаемого диапазона (приблизительно годы от 1 до 9999).
Подводный камень: нумерация месяцев начинается с Тишрея
Это самая распространённая ошибка при работе с jewishtojd(). Еврейский религиозный год начинается весной (Нисан), однако PHP нумерует месяцы начиная с Тишрея (гражданский новый год, Рош а-Шана). Таким образом:
| # | Месяц (не високосный год) |
|---|---|
| 1 | Тишрей |
| 2 | Хешван |
| 3 | Кислев |
| 4 | Тевет |
| 5 | Шват |
| 6 | Адар |
| 7 | Адар (то же, что 6 в не високосный год) |
| 8 | Нисан |
| 9 | Ияр |
| 10 | Сиван |
| 11 | Таммуз |
| 12 | Ав |
| 13 | Элул |
В високосный год добавляется дополнительный месяц: месяц 6 становится Адар I, а месяц 7 — Адар II. Передача 6 не означает июнь или Сиван — Сиван является месяцем 10.
Базовый пример
Этот пример преобразует 6 Сивана 5783 (праздник Шавуот, это 10-й месяц, день 6) в юлианский номер дня, а затем обратно в григорианскую дату для проверки:
Конвертация еврейской даты в юлианский номер дня
<?php
$jewishMonth = 10; // Sivan
$jewishDay = 6;
$jewishYear = 5783;
$jdn = jewishtojd($jewishMonth, $jewishDay, $jewishYear);
echo "Julian Day Count: " . $jdn . "\n";
echo "Gregorian date: " . jdtogregorian($jdn) . "\n";Вывод:
Julian Day Count: 2460091
Gregorian date: 5/26/2023Таким образом, 6 Сивана 5783 соответствует 26 мая 2023 года по григорианскому календарю.
Конвертация еврейской даты в григорианскую
Совместное использование jewishtojd() с jdtogregorian() — типичный практический сценарий, например для нахождения григорианской даты Рош а-Шана (1 Тишрея):
<?php
function jewishToGregorian(int $month, int $day, int $year): string
{
$jdn = jewishtojd($month, $day, $year);
if ($jdn === 0) {
return "Invalid Jewish date";
}
return jdtogregorian($jdn);
}
echo jewishToGregorian(1, 1, 5784) . "\n"; // Rosh Hashanah 5784Вывод:
9/16/2023Обратное преобразование с jdtojewish()
Обратной функцией к jewishtojd() является jdtojewish(), которая превращает юлианский номер дня обратно в строку еврейской даты формата месяц/день/год. Обратное преобразование — хороший способ убедиться в правильности нумерации месяцев:
<?php
$jdn = jewishtojd(10, 6, 5783); // 6 Sivan 5783
echo "JDN: " . $jdn . "\n";
echo "Jewish: " . jdtojewish($jdn) . "\n"; // month/day/yearВывод:
JDN: 2460091
Jewish: 10/6/5783Обработка некорректных данных
Если PHP не может представить переданную дату, jewishtojd() возвращает 0, а не генерирует ошибку, поэтому всегда проверяйте результат перед передачей его другой функции:
<?php
$jdn = jewishtojd(0, 5, 5783); // month 0 is invalid
var_dump($jdn); // int(0)
echo $jdn === 0 ? "Out of range\n" : jdtogregorian($jdn) . "\n";Вывод:
int(0)
Out of rangeКогда это может понадобиться?
- Отображение еврейских/праздничных дат из базы данных в локальном григорианском календаре пользователя.
- Вычисление количества дней между двумя датами, заданными в разных календарных системах (вычтите их JDN).
- Нахождение дня недели для еврейской даты путём передачи JDN в
jddayofweek().
Заключение
jewishtojd() преобразует дату по еврейскому (иврит) календарю в юлианский номер дня — календарно-нейтральное целое число, которое расширение PHP calendar использует как мост для всех межкалендарных конвертаций. Запомните два ключевых момента: нумерация месяцев начинается с Тишрея (1), а не с Нисана, и функция возвращает 0 для дат, выходящих за пределы диапазона. Используйте её вместе с jdtogregorian(), jdtojewish() или jddayofweek() для построения полноценных процессов работы с датами.