mcpField
I
idf-date-converter

idf-date-converter

github.com/skills-il生产力13153 次安装3 天前更新
代码仓库

关于 idf-date-converter

idf-date-converter 是处理希伯来历与公历日期的 Skill,面向需要节日日期、双历格式或以色列工作日计算的用户。它结合 pyluach 脚本和规则说明,特别区分日落前后的希伯来日期及不同节日对工作日的影响。

主要功能

  1. 01希伯来历与公历互转
  2. 02生成希伯来文数字和双历日期
  3. 03查询以色列节日与禁食日
  4. 04计算以色列工作日及休息日
  5. 05说明安息日点烛与结束时间查询

适用场景

  1. 01为以色列文件填写双历日期
  2. 02查询节日日期及开始时间
  3. 03计算含法定休息日的工作日数

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/skills-il/developer-tools --skill idf-date-converter

安装后在 Claude Code 中输入/idf-date-converter确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

evidence.json
metadata.json
optimization-log.json
SKILL_HE.md
references/
hebrew-calendar-reference.md
scripts/
convert_date.py

详细介绍

IDF 日期转换器

说明

步骤 1:识别请求
请求操作
转换指定日期公历转希伯来历,或希伯来历转公历
X 节日是什么时候?查询希伯来历中的节日
文档格式希伯来历 + 公历双日期字符串
工作日计算天数,不包括安息日 + 节日
安息日时间查询某城市的安息日点烛时间 / Havdalah 时间(参见步骤 7)
步骤 2:日期转换

使用 Python 进行转换:

# Using pyluach library
from pyluach import dates, hebrewcal

# Gregorian to Hebrew
greg_date = dates.GregorianDate(2026, 2, 24)
heb_date = greg_date.to_heb()
print(f"{heb_date.day} {heb_date.month_name()} {heb_date.year}")

# Hebrew to Gregorian (always verify the resulting date by round-tripping)
heb_date = dates.HebrewDate(5786, 11, 15)  # 15 Shvat 5786 (Tu B'Shvat). pyluach numbers months from Nisan=1, so Shvat=11
greg_date = heb_date.to_greg()
print(f"{greg_date.day}/{greg_date.month}/{greg_date.year}")
步骤 3:希伯来数字格式

希伯来日期使用 gematria(字母数字系统):

  • 个位数:alef=1、bet=2、gimel=3,……tet=9
  • 十位数:yod=10、kaf=20、lamed=30,……tzadi=90
  • 百位数:kuf=100、resh=200、shin=300、tav=400
  • 特例:15 = tet-vav(不是 yod-heh),16 = tet-zayin(不是 yod-vav)
  • 年份:省略千位数(5786 写作 tav-shin-peh-vav = 786)
步骤 4:双日期格式

用于以色列文件:

24 February 2026 / 7 Adar 5786

(5786 是一个普通的希伯来年份,不是闰年,因此只有一个 Adar,没有 Adar I / Adar II。打印双日期字符串前,请务必运行 pyluach 确认。)

步骤 5:以色列工作日

以色列的工作周为周日至周四(许多行业周五只工作半天)。

人们称作“节日”的日子并非全部放假,这一区别会影响天数计算。请分为两个层级:

层级日期对工作日计数的影响
法定休息日Rosh Hashana(2 天)、Yom Kippur、Sukkot 第 1 天、Shmini Atzeret / Simchat Torah、Pesach 第 1 天、Pesach 第 7 天、Shavuot、Yom HaAtzmaut扣除。这些日子里,以色列的工作场所、银行和公共交通依法关闭
纪念日Purim、Shushan Purim、Yom HaZikaron、Yom HaShoah、Yom Yerushalayim、Yom HaAliyah、Rabin Memorial Day、Sigd、Chol HaMoed、Chanukah、Tu B'Shvat、Lag BaOmer、所有公共斋戒日报告,但不要扣除。工作场所通常照常开放,不过工作时间往往会缩短
节日前夕Erev Rosh Hashana、Erev Yom Kippur、Erev Sukkot、Hoshana Rabba、Erev Pesach、Erev Pesach VII、Erev Shavuot报告为半天。银行、政府机关和法院会在中午前后关闭;Erev Pesach 中午后几乎全面停业。如果按小时计算,请扣除半天

安息日(周五日落至周六日落)始终排除在外。宣布举行选举时,选举日也予以排除。

脚本会报告 Yom Yerushalayim 和 Yom HaAliyah,但会有意省略 Rabin Memorial Day 和 Sigd,因为它无法模拟这两个节日的日期规则;请直接查询这两项。

请注意,在耶路撒冷和其他历史悠久的城墙城市,实际庆祝的 Purim 是 Shushan Purim(Adar 15 日),而不是 Adar 14 日:学校和许多工作场所会在这一天关闭。

scripts/convert_date.py business-days <start> <end> 严格按照上述分类进行计算,并将纪念日与扣除的休息日分别列出,方便你采用所在行业的惯例。

步骤 6:希伯来历的一天从日落开始

希伯来历日期并非从午夜到午夜。它从前一公历日的傍晚日落时(shkia)开始,到次日夜幕降临时(tzeit hakochavim)结束。这个领域的所有库(包括 pyluach)转换的都是白天日期:GregorianDate(2026, 2, 24).to_heb() 返回 5786 年 Adar 月 7 日。对于 2 月 24 日日出至当日日落这段时间,这是正确的;但对于日落后的时段,则不正确。

当答案涉及具体时刻,而不只是历法日期时,这一点很重要:

  • 日落后,日期加一天。 用户在 2026 年 2 月 24 日 20:00 询问“今天的希伯来历日期是什么?”,想知道的是 Adar 月 8 日,而不是 Adar 月 7 日。回答前,请询问或推断当地时间,并说明采用了哪种约定。
  • 逝世周年纪念日、成人礼日期和法律文件日期,均按事件实际发生时的希伯来历日期计算。若出生时间为 23:00,则属于希伯来历的次日。
  • 节日从前一晚开始。 “Yom Kippur 是 2026 年 9 月 21 日”表示禁食从 9 月 20 日日落时开始。该技能的表格提供的是节日白天所在的公历日期,这是标准约定,并非节日开始的傍晚日期。
  • 不要自行计算日落时间。 日落时间因地点而异,需要使用太阳位置库或 API。请使用 hebcal 的 zmanim 端点和 geonameid,或说明答案以白天为准。

随附脚本刻意不会猜测:它报告白天对应的希伯来历日期。若问题涉及具体时段,请自行调整晚间日期。

步骤 7:安息日和节日时间

安息日烛光点燃时间和 havdalah 时间取决于太阳位置,而非历法,因此无法通过日期转换得出。不要计算或估算这些时间。请使用城市的 geonameid 查询 Hebcal 的 Shabbat 端点:

https://www.hebcal.com/shabbat?cfg=json&geonameid=281184&M=on

常见的以色列 geonameid:Jerusalem 281184、Tel Aviv 293397、Haifa 294801、Beersheba 295530。

这个领域的大多数错误都源于以下两种约定:

  • 烛光点燃时间的提前量并不统一。 Hebcal 默认在日落前 18 分钟,但 Jerusalem 为 40 分钟,Haifa 和 Zikhron Ya'akov 为 30 分钟,这符合当地习俗。只有当用户指出不同习俗时,才使用 b=<minutes> 覆盖。切勿假设全国都采用提前 18 分钟的标准。
  • Havdalah 有多种约定(M=on 表示按太阳高度角计算夜幕降临时间;另一种方式是通过 m=<minutes> 设置日落后的固定分钟数)。请说明你采用了哪种方式。

同一个端点也会返回 Rosh Hashana、Yom Kippur、Sukkot、Shmini Atzeret、Simchat Torah、Pesach 和 Shavuot 的节日前夕烛光点燃时间。

以公历日期表示的 2026 年以色列节日与禁食日

所有日期均为公历 2026 年。希伯来月份跨越两个希伯来年(提市黎月延续到下一个希伯来年)时,该行列出节日实际所在的希伯来年。

节日 / 禁食日希伯来日期公历 2026 年(约)希伯来年
Tu B'Shvat15 ShvatFeb 25786
Fast of Esther (Ta'anit Esther)13 AdarMar 25786
Purim14 AdarMar 35786
Shushan Purim15 AdarMar 45786
Pesach15-21 NisanApr 2-85786
Yom HaShoah27 NisanApr 145786
Yom HaZikaron4 IyarApr 215786
Yom HaAtzmaut5 IyarApr 225786
Lag BaOmer18 IyarMay 55786
Shavuot6 SivanMay 225786
Fast of 17 Tammuz (Shiv'a Asar B'Tammuz)17 TammuzJul 25786
Tisha B'Av (9 Av)9 AvJul 235786
Rosh Hashana1-2 TishreiSep 12-135787
Fast of Gedaliah (Tzom Gedaliah)3 TishreiSep 145787
Yom Kippur10 TishreiSep 215787
Sukkot15-21 TishreiSep 26 - Oct 25787
Simchat Torah22 TishreiOct 35787
Chanukah (5787)25 Kislev - 2 TevetDec 5-12, 20265787
Fast of 10 Tevet (Asarah B'Tevet)10 TevetDec 205787

关于 Chanukah 的说明:5787 年的 Chanukah 从 2026 年 12 月 4 日日落后开始(点燃第一支蜡烛),第一个完整的公历日是 2026 年 12 月 5 日(25 Kislev)。节日于 2026 年 12 月 12 日结束(2 Tevet)。表格列出的是 5787 年的 Chanukah,因为这一次落在公历 2026 年。

投入生产使用前,请务必使用 pyluach 核验这些日期。上方修正后的日期是在 v2.0.0 中重新生成的;最初发布的 2026 年日期预测表约有一半条目存在相差一天的错误。

Yom HaZikaron / Yom HaAtzmaut 日期顺延规则

以色列议会立法规定了 Yom HaZikaron 和 Yom HaAtzmaut 的日期顺延规则,以避免亵渎安息日。打印日期前请应用这些规则:

  • 如果 5 Iyar 落在星期五或星期六,Yom HaAtzmaut 提前至星期四(4 Iyar 或 3 Iyar)。Yom HaZikaron 随之调整。
  • 如果 5 Iyar 落在星期一,Yom HaAtzmaut 延后至星期二(6 Iyar),以免 Yom HaZikaron 在星期六晚间举行、与安息日相邻的仪式开始。
  • 5 Iyar 只可能落在星期一、星期三、星期五或星期六。如果落在星期三,则不适用顺延规则。
  • Yom HaShoah(27 Nisan)也会相应顺延:如果落在星期五,则提前至星期四(26 Nisan);如果落在星期日,则延后至星期一(28 Nisan)。

这些规则有生效年份;将其用于历史年份会造成不易察觉的错误。 Yom HaAtzmaut 于 1949 年依法成为国定节日;星期五 / 星期六顺延规则于 1951 年确立;星期一延期规则则仅自 2004 年起生效。Yom HaZikaron 始于 1951 年(1963 年立法确立),而 Yom HaShoah 定于 27 Nisan 则源自 1951 年以色列议会决议。使用现行规则将 1950 年代至 1990 年代的日期转换时,每个 2004 年之前的星期一年份都会使 Yom HaAtzmaut 偏移一天;而对于这些节日尚未设立的年份,转换结果还会包含全部三个节日。scripts/convert_date.py 会根据每条规则各自的生效年份进行判断。

2026 年,5 Iyar 落在星期三(4 月 22 日),因此不适用顺延规则。2026 至 2035 年这 10 年中有 6 年需要顺延(2028、2029、2031、2032、2034、2035),因此不应用这些规则构建的查找表,错的时候比对的时候更多。scripts/convert_date.py 会应用这些规则。

快速顺延禁食日(nidcheh)

公共禁食日从不安排在安息日,而四个会移动日期的禁食日并非都朝同一方向移动:

  • 杰达利亚禁食日(提斯利月 3 日)、塔穆兹月 17 日和提莎贝阿夫节(阿夫月 9 日)若逢安息日,均顺延至下一个星期日。
  • **以斯帖禁食日(亚达月 13 日)**则提前至前一个星期四(亚达月 11 日),因为它必须在普珥节之前。
  • **特别忏悔日(提别月 10 日)**可能落在星期五,但从不落在安息日,因此从不移动。

在闰年,以斯帖禁食日、普珥节和书珊普珥节落在亚达二月(pyluach 月份 13),而非亚达一月(月份 12)。在闰年为普珥节传入月份 12,会得到早整整一个月的日期。

示例

示例 1:简单转换

用户说:“今天的希伯来日期是什么?” 结果:“2026 年 2 月 24 日 = 5786 年亚达月 7 日”(5786 年是平年,因此只有一个亚达月,没有亚达一月/亚达二月)

示例 2:节日查询

用户说:“2026 年逾越节是什么时候?” 结果:“逾越节于 2026 年 4 月 1 日日落后开始(5786 年尼散月 15 日)。第一场逾越节晚餐:4 月 2 日。以色列的最后一天:4 月 8 日。”

示例 3:工作日

用户说:“2026 年 3 月 1 日至 3 月 31 日之间有多少个工作日?” 结果:统计时排除安息日,并注明区间内是否有节日(普珥节为 3 月 3 日,书珊普珥节为 3 月 4 日)。

随附资源

脚本
  • scripts/convert_date.py ,在希伯来历与公历之间转换日期,为以色列文档格式化双历日期,列出任意年份的以色列节日,并统计日期区间内的以色列工作日(排除安息日和节日)。需要 pyluach 库。运行:python scripts/convert_date.py --help
参考资料
  • references/hebrew-calendar-reference.md ,完整的希伯来历参考资料,涵盖月份名称及其天数变化、19 年默冬周期闰年规则、含特殊情况的希伯来数字转换表、以色列节日日历(区分停工日和部分停业日),以及推荐的 Python 库(pyluach、hebcal)。处理闰年边缘情况、格式化希伯来数字或确定哪些节日会影响工作日计算时,请查阅此资料。

注意事项

  • 希伯来历月份天数不固定(29 天或 30 天),闰年还会增加一个整月(亚达二月)。Agent 可能会误以为月份天数固定,或套用公历闰年规则。
  • 以色列官方文件使用希伯来日期(例如“כ"ה באדר תשפ"ו”),而商业文件使用公历 DD/MM/YYYY。Agent 可能不清楚不同情境下应采用哪种格式。
  • 犹太节日对应的公历日期每年都会变化。使用静态训练数据的 Agent 可能会给出当前年份的犹太新年、逾越节等节日的错误日期。
  • 希伯来年从提斯利月(9 月/10 月)开始,而非 1 月。转换公历新年附近的日期时,Agent 可能会算错希伯来年的边界。
  • 纪念日、独立日和大屠杀纪念日受法律规定的星期调整规则约束,以避免与安息日冲突。若静态查询表不检查星期几,直接将日期固定写为“艾亚尔月 5 日”,约有一半情况下会给出错误日期。务必应用上述调整规则。
  • 光明节通常跨越两个公历年(12 月下旬至 1 月上旬)。标注公历年份列时,应选取实际有基斯流月 25 日落在该公历年内的希伯来年份。在同一行中混用 5786 年和 5787 年的日期是常见错误。

参考链接

来源URL检查内容
Hebcal 犹太历https://www.hebcal.com权威节日日期;如需遵循以色列的节日安排,请设置为以色列日程
Hebcal 开发者 APIhttps://www.hebcal.com/home/developer-apis用于节日表、日期转换和 zmanim(日落)的 REST 端点
pyluachhttps://github.com/simlist/pyluachPython 参考实现;月份编号和闰年处理
Yom HaAtzmaut 日期调整https://en.wikipedia.org/wiki/Yom_Ha%27atzmaut1951 年和 2004 年的日期调整决定
希伯来数字https://en.wikipedia.org/wiki/Hebrew_numeralsGematria 表以及 15 / 16 的例外

故障排除

错误:“希伯来日期不正确”

原因:希伯来月份的长度不一;闰年月份容易混淆 解决方案:使用 hebcal.com 核对。Adar I/II 仅在闰年存在。当前年份(5786)的闰年状态会影响日期。

错误:普珥节前后转换后的日期恰好相差一个月

原因:闰年时,pyluach 将 Adar I 编为第 12 月,将 Adar II 编为第 13 月,而调用方往往会直觉地在第 12 月查找“Adar”。普珥节在 Adar II。 解决方案:选取月份编号前,先根据是否为闰年进行分支:13 if year % 19 in {0,3,6,8,11,14,17} else 12。convert_date.py to-gregorian 会将闰年的第 12 月标记为“Adar I”,因此错误会直接显示在输出中,而不是悄无声息地发生。

错误:转换后的日期恰好相差一天

原因:几乎总是希伯来历的日界问题(见步骤 6)。库返回的是白天的日期,而问题询问的是晚上的日期,或反之。如果偏差恰好为一天且在不同日期都能复现,则已确认这不是闰年或月份长度导致的问题。 解决方案:确定事件发生的当地时间。日落之后,将库返回的日期加一天。

评论

支持 Markdown