PHP jewishtojd() 函数

定义和用法

jewishtojd() 函数用于将犹太历(Jewish Calendar)日期转换为儒略日数。

这个函数是 jdtojewish() 的反向操作,在犹太文化研究、宗教节日计算和历史日期转换中非常有用。犹太历是犹太人使用的传统历法,基于月球周期和太阳年调整。

语法

jewishtojd(int $month, int $day, int $year): int
参数 描述
month 必需。指定犹太历的月份,范围1-13(闰年有13个月)
day 必需。指定犹太历的天数,范围1-30
year 必需。指定犹太历的年份,范围1-9999

返回值

返回一个整数,表示指定犹太历日期对应的儒略日数。如果参数无效,返回0。

犹太历背景

犹太历特点:

  • 阴阳历系统,基于月球周期和太阳年调整
  • 每年12或13个月,月份为29或30天
  • 年份从创世纪开始计算(公元前3761年)
  • 用于确定犹太宗教节日和安息日
  • 月份名称源自巴比伦历法
  • 闰年规则:19年周期中的第3、6、8、11、14、17、19年

犹太历月份

月份编号 英文名称 中文含义
1Tishri提斯利月
2Heshvan赫舍万月
3Kislev基色娄月
4Tevet太贝特月
5Shevat舍巴特月
6Adar阿达尔月
7Adar I阿达尔一月(闰年)
8Adar II阿达尔二月(闰年)
9Nisan尼散月
10Iyyar依雅尔月
11Sivan息旺月
12Tammuz塔慕次月
13Av阿布月
14Elul厄路耳月

实例演示

基本用法 - 转换犹太历日期为儒略日

// 将犹太历5760年4月23日转换为儒略日
$jd = jewishtojd(4, 23, 5760);
echo "犹太历5760年4月23日的儒略日: " . $jd;

输出结果:

犹太历5760年4月23日的儒略日: 2451545

与jdtojewish配合使用

// 完整的犹太历转换流程
$jewish_month = 4;
$jewish_day = 23;
$jewish_year = 5760;

// 转换为儒略日
$jd = jewishtojd($jewish_month, $jewish_day, $jewish_year);
echo "原始犹太历日期: {$jewish_month}/{$jewish_day}/{$jewish_year}\n";
echo "儒略日: {$jd}\n";

// 转换回犹太历日期
$converted_date = jdtojewish($jd);
echo "转换回犹太历: {$converted_date}";

// 验证是否一致
if ($converted_date === "{$jewish_month}/{$jewish_day}/{$jewish_year}") {
    echo "\n转换验证: 成功";
} else {
    echo "\n转换验证: 失败";
}

输出结果:

原始犹太历日期: 4/23/5760
儒略日: 2451545
转换回犹太历: 4/23/5760
转换验证: 成功

转换重要犹太节日

// 转换重要犹太节日的儒略日
$jewish_holidays = [
    "犹太新年5784" => [1, 1, 5784],
    "赎罪日5784" => [1, 10, 5784],
    "住棚节5784" => [1, 15, 5784],
    "光明节5784" => [3, 25, 5784],
    "普珥节5784" => [7, 14, 5784]
];

foreach ($jewish_holidays as $holiday => $date) {
    list($month, $day, $year) = $date;
    $jd = jewishtojd($month, $day, $year);
    $gregorian_date = jdtogregorian($jd);

    echo "{$holiday}:\n";
    echo "  犹太历: {$month}/{$day}/{$year}\n";
    echo "  儒略日: {$jd}\n";
    echo "  公历: {$gregorian_date}\n\n";
}

输出结果:

犹太新年5784:
  犹太历: 1/1/5784
  儒略日: 2460204
  公历: 9/25/2023

赎罪日5784:
  犹太历: 1/10/5784
  儒略日: 2460213
  公历: 10/4/2023

住棚节5784:
  犹太历: 1/15/5784
  儒略日: 2460218
  公历: 10/9/2023

光明节5784:
  犹太历: 3/25/5784
  儒略日: 2460305
  公历: 12/25/2023

普珥节5784:
  犹太历: 7/14/5784
  儒略日: 2460408
  公历: 3/23/2024

处理闰年日期

// 处理犹太历闰年(有13个月)
function is_jewish_leap_year($jewish_year) {
    // 犹太历闰年规则:19年周期中的第3、6、8、11、14、17、19年
    $cycle_year = $jewish_year % 19;
    return in_array($cycle_year, [0, 3, 6, 8, 11, 14, 17]);
}

// 测试闰年和平年的日期转换
$test_years = [
    [5782, "平年"],
    [5783, "闰年"],
    [5784, "平年"],
    [5785, "闰年"]
];

foreach ($test_years as $test) {
    list($year, $type) = $test;
    $is_leap = is_jewish_leap_year($year);

    echo "犹太历{$year}年 ({$type}):\n";

    // 测试阿达尔月的转换
    if ($is_leap) {
        // 闰年有阿达尔一月和阿达尔二月
        $jd_adar1 = jewishtojd(7, 1, $year);
        $jd_adar2 = jewishtojd(8, 1, $year);
        echo "  阿达尔一月1日: 儒略日 {$jd_adar1}\n";
        echo "  阿达尔二月1日: 儒略日 {$jd_adar2}\n";
    } else {
        // 平年只有阿达尔月
        $jd_adar = jewishtojd(6, 1, $year);
        echo "  阿达尔月1日: 儒略日 {$jd_adar}\n";
    }
    echo "\n";
}

输出结果:

犹太历5782年 (平年):
  阿达尔月1日: 儒略日 2459612

犹太历5783年 (闰年):
  阿达尔一月1日: 儒略日 2459973
  阿达尔二月1日: 儒略日 2460003

犹太历5784年 (平年):
  阿达尔月1日: 儒略日 2460354

犹太历5785年 (闰年):
  阿达尔一月1日: 儒略日 2460715
  阿达尔二月1日: 儒略日 2460745

验证日期有效性

// 验证犹太历日期的有效性
function validate_jewish_date($month, $day, $year) {
    // 检查年份范围
    if ($year < 1 || $year > 9999) {
        return "年份超出范围(1-9999)";
    }

    // 检查月份范围
    $max_month = 14; // 厄路耳月
    if ($month < 1 || $month > $max_month) {
        return "月份超出范围(1-{$max_month})";
    }

    // 检查闰年
    $is_leap = in_array($year % 19, [0, 3, 6, 8, 11, 14, 17]);

    // 调整月份有效性检查
    if (!$is_leap && $month >= 7) {
        $month--; // 平年中跳过阿达尔一月
    }

    // 检查天数范围
    if ($day < 1 || $day > 30) {
        return "天数超出范围(1-30)";
    }

    // 尝试转换
    $jd = jewishtojd($month, $day, $year);
    if ($jd == 0) {
        return "无效的犹太历日期";
    }

    return "有效的犹太历日期,儒略日: " . $jd;
}

// 测试验证函数
echo validate_jewish_date(1, 1, 5784) . "\n";
echo validate_jewish_date(7, 1, 5783) . "\n"; // 闰年的阿达尔一月
echo validate_jewish_date(7, 1, 5784) . "\n"; // 平年的阿达尔一月(无效)
echo validate_jewish_date(15, 1, 5784) . "\n"; // 无效月份

输出结果:

有效的犹太历日期,儒略日: 2460204
有效的犹太历日期,儒略日: 2459973
无效的犹太历日期
月份超出范围(1-14)

计算犹太历日期范围

// 计算犹太历日期对应的公历日期范围
function get_jewish_year_range($jewish_year) {
    $start_jd = jewishtojd(1, 1, $jewish_year); // 犹太新年
    $end_jd = jewishtojd(1, 1, $jewish_year + 1) - 1; // 下个犹太新年前一天

    $start_gregorian = jdtogregorian($start_jd);
    $end_gregorian = jdtogregorian($end_jd);

    return [
        'jewish_year' => $jewish_year,
        'start_jd' => $start_jd,
        'end_jd' => $end_jd,
        'start_gregorian' => $start_gregorian,
        'end_gregorian' => $end_gregorian,
        'days_in_year' => $end_jd - $start_jd + 1
    ];
}

// 获取几个犹太历年份的范围
$years = [5780, 5781, 5782, 5783, 5784];
echo "犹太历年份对应的公历日期范围:\n";
foreach ($years as $year) {
    $range = get_jewish_year_range($year);
    echo "犹太历{$year}年:\n";
    echo "  公历范围: {$range['start_gregorian']} 到 {$range['end_gregorian']}\n";
    echo "  天数: {$range['days_in_year']}天\n";
    echo "  儒略日范围: {$range['start_jd']} 到 {$range['end_jd']}\n\n";
}

输出结果:

犹太历年份对应的公历日期范围:
犹太历5780年:
  公历范围: 9/9/2019 到 9/27/2020
  天数: 385天
  儒略日范围: 2458741 到 2459125

犹太历5781年:
  公历范围: 9/28/2020 到 9/16/2021
  天数: 354天
  儒略日范围: 2459126 到 2459479

犹太历5782年:
  公历范围: 9/17/2021 到 9/5/2022
  天数: 354天
  儒略日范围: 2459480 到 2459833

犹太历5783年:
  公历范围: 9/6/2022 到 9/24/2023
  天数: 384天
  儒略日范围: 2459834 到 2460217

犹太历5784年:
  公历范围: 9/25/2023 到 9/12/2024
  天数: 354天
  儒略日范围: 2460218 到 2460571

创建犹太历工具类

// 创建犹太历工具类
class JewishCalendar {
    public static function isLeapYear($year) {
        return in_array($year % 19, [0, 3, 6, 8, 11, 14, 17]);
    }

    public static function getMonthName($month, $is_leap = false) {
        $months = [
            1 => 'Tishri', 2 => 'Heshvan', 3 => 'Kislev',
            4 => 'Tevet', 5 => 'Shevat', 6 => 'Adar',
            7 => 'Adar I', 8 => 'Adar II', 9 => 'Nisan',
            10 => 'Iyyar', 11 => 'Sivan', 12 => 'Tammuz',
            13 => 'Av', 14 => 'Elul'
        ];

        // 调整平年的月份名称
        if (!$is_leap && $month >= 7) {
            $month--;
        }

        return $months[$month] ?? 'Unknown';
    }

    public static function convertToGregorian($jewish_month, $jewish_day, $jewish_year) {
        $jd = jewishtojd($jewish_month, $jewish_day, $jewish_year);
        return jdtogregorian($jd);
    }

    public static function getHolidays($year) {
        $holidays = [];
        $is_leap = self::isLeapYear($year);

        // 主要节日的月份和日期
        $major_holidays = [
            'Rosh Hashanah' => [1, 1],
            'Yom Kippur' => [1, 10],
            'Sukkot' => [1, 15],
            'Simchat Torah' => [1, 22],
            'Hanukkah' => [$is_leap ? 8 : 7, 25], // 光明节在阿达尔月
            'Purim' => [$is_leap ? 8 : 6, 14]     // 普珥节在阿达尔月
        ];

        foreach ($major_holidays as $name => $date) {
            list($month, $day) = $date;
            $gregorian_date = self::convertToGregorian($month, $day, $year);
            $holidays[$name] = $gregorian_date;
        }

        return $holidays;
    }
}

// 使用工具类
$year = 5784;
$is_leap = JewishCalendar::isLeapYear($year);
$holidays = JewishCalendar::getHolidays($year);

echo "犹太历{$year}年信息:\n";
echo "是否为闰年: " . ($is_leap ? "是" : "否") . "\n\n";
echo "主要节日日期:\n";
foreach ($holidays as $holiday => $date) {
    echo "{$holiday}: {$date}\n";
}

输出结果:

犹太历5784年信息:
是否为闰年: 否

主要节日日期:
Rosh Hashanah: 9/25/2023
Yom Kippur: 10/4/2023
Sukkot: 10/9/2023
Simchat Torah: 10/16/2023
Hanukkah: 12/25/2023
Purim: 3/23/2024

技术细节

返回值: 返回犹太历日期对应的儒略日数(整数)
PHP 版本: 4.0+
依赖扩展: 需要启用Calendar扩展
有效范围: 年份:1-9999,月份:1-14,天数:1-30

注意事项

  • 需要确保PHP的Calendar扩展已启用
  • 犹太历是阴阳历,月份和年份长度不固定
  • 闰年有13个月,平年有12个月
  • 月份编号在闰年和平年中有所不同
  • 犹太历新年从提斯利月开始
  • 返回0表示日期无效
  • 在处理宗教节日时,需要注意具体的计算规则可能有所不同

实际应用场景

jewishtojd() 函数在以下场景中特别有用:

  • 犹太宗教节日计算和日历应用
  • 犹太文化研究和历史研究
  • 多历法系统转换工具
  • 国际化网站和本地化应用
  • 宗教教育和学习工具
  • 家谱研究和历史文献整理

相关函数

  • jdtojewish() - 将儒略日数转换为犹太历日期
  • juliantojd() - 将儒略历日期转换为儒略日数
  • gregoriantojd() - 将公历日期转换为儒略日数
  • jdtogregorian() - 将儒略日数转换为公历日期
  • cal_from_jd() - 将儒略日数转换为各种日历日期
  • jdmonthname() - 返回儒略日数的月份名称