W3docs

Как конвертировать еврейскую дату в юлианскую в 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() для построения полноценных процессов работы с датами.

Практика

Практика
Какова функция jewishtojd() в PHP?
Какова функция jewishtojd() в PHP?
Was this page helpful?