17 个版本 (稳定版)

1.5.0 2020 年 1 月 9 日
1.4.3 2020 年 1 月 15 日
1.2.2 2019 年 12 月 6 日
1.0.0 2019 年 5 月 26 日
0.0.4 2019 年 2 月 7 日

#201日期和时间

Download history 18/week @ 2024-03-26 60/week @ 2024-04-02 66/week @ 2024-07-02

66 每月下载量

MIT 许可证

7MB
4K SLoC

heca

用 Rust 编写的希伯来日历。它可以将希伯来历转换为公历并反向转换,并列出犹太节日。

Crates.io Build Status Average time to resolve an issue Percentage of issues still open License: MIT

安装

直接

您可以从 发布页面 下载 Linux(静态链接)和 macos 可执行文件(未测试)。

然后运行

$ mv ~/Downloads/heca-$VERSION-$TARGET /usr/local/bin/heca
$ chmod +x /usr/local/bin/heca
$ heca

Arch AUR

$ yaourt -S heca

Cargo

如果您已安装 cargo,您可以运行

$ cargo install heca

使用方法

heca [OPTIONS] [SUBCOMMAND]

选项

  1. --config:设置配置文件。有关更多信息,请参阅配置部分。如果未设置,它将尝试读取 $XDG_CONFIG_HOME/heca/config.toml)。
  2. --language:设置输出语言。选项为希伯来语(he_IL)或英语(en_US)。如果未设置,它将尝试从 LANG 环境变量中获取您的语言。如果 LANG 未设置(或设置为非 he_IL 的内容),则默认为英语。
  3. --print:将结果以 JSON、常规或美化格式打印出来(目前别名常规)。

子命令

转换

heca convert [OPTIONS] <Date>
选项
  1. --datefmt <DateFormat>:设置日期格式(仅适用于公历):US 或 M 为 mm/dd/yyyy,UK 或 L 为 dd/mm/yyyy,ISO 或 B 为 yyyy/mm/dd。默认为 ISO。
  2. --type <T>:强制从类型 T 转换,其中 T 是 "hebrew"(日期必须写成 '5/אדרא/5779'),"gregorian"(日期必须写成 '1996/12/19'),或模糊(如果年份大于 4000,则假定希伯来语,否则为公历。它还尝试在希伯来月份的拼写和顺序上进行模糊匹配)。默认为 fuzzy

列表

heca list [FLAGS] [OPTIONS] <Year>
重要提示

由于犹太日从夜晚开始,与大多数日历不同,列出的日期是 开始 日期,而不是结束日期。因此,如果第一个逾越节是在周五晚上,我将会输出逾越节的开始是周五,而不是安息日。

选项
  1. --no-sort:不排序输出。如果您只想查找某个特定日期,这很有用。

    也可以通过设置 HECA_NOSORT=1 来配置。

  2. --years <AmountYears>:生成n年的事件。默认值为1。

  3. --show <Events>:列出哪些事件。可能的值有

    1. yom-tov - 列出主要节日 - 罗什哈沙纳、赎罪日、逾越节、五旬节和住棚节。
    2. shabbos - 列出每周的托拉段落。
    3. special-parshas - 列出冬季阅读的四个特殊托拉段落。
    4. chol - 显示有特殊托拉阅读的平日 - 包括舒什安普里姆。
    5. minor-holidays - 拉格巴欧默、赎罪节第二日和逾越节前夕。
    6. omer - 列出奥梅尔。
    7. custom-holidays - 列出配置文件中的日期。
    8. daf-yomi - 列出每日达夫·约米。
    9. yerushalmi-yomi - 列出每日耶路撒冷日。
    10. rambam-3-chapters - 列出每日拉姆巴姆(每天3章)。
    11. rambam-1-chapter - 列出每日拉姆巴姆(每天1章)。
    12. israeli-holidays - 列出hebcal显示的以色列节日(耶路撒冷日、西格德、大屠杀纪念日、以色列独立日和耶路撒冷日)。
    13. chabad-holidays - 列出查巴德不读塔哈努恩的日期(10基斯列夫、19/20基斯列夫和12/13塔穆兹)。
    14. shabbos-mevarchim - 列出下个月即将到来的安息日梅瓦尔钦。它还会输出朔望(新月)的时间。

    默认是 yom-tov

  4. --location:选择您是在寻找以色列日历还是犹太日历。选项是 "Chul" 或 "Israel"。默认为Chul,除非语言是希伯来语,在这种情况下默认为Israel。也可以通过 HECA_LOCATION 进行配置。

  5. --type:强制从类型T转换,其中T是 "hebrew"(然后日期必须写成 '5/אדרא/5779'),"gregorian"(日期必须写成 '1996/12/19'),或模糊(如果年份在4000年以上,则假设为希伯来语,否则为公历。它还在希伯来月拼写和顺序上尝试模糊)。默认为 fuzzy

    也可以通过 HECA_YEAR_TYPE 进行配置。

  6. --exact-days:拉比法庭、阿哈龙·索洛维奇克拉比和赫舍尔·沙赫特拉比之间存在争议。拉比法庭表示,如果这些日子在安息日附近,我们应该将它们移动,以免导致人们违反安息日。而阿哈龙·索洛维奇克拉比和赫舍尔·沙赫特拉比表示,在美国,人们应该始终在给定那天庆祝。此选项覆盖了拉比法庭的默认裁决。

    也可以通过 HECA_EXACT_DAYS 进行配置。

配置文件

配置是一个TOML文件,包含几个选项

  1. days - 一个数组。可以是

    a. 已弃用:一个三个元素的数组。第一个是希伯来日,第二个是在美观打印时输出的字符串,第三个是在JSON打印时输出的字符串。如果日期在某年不存在(例如,并非所有年份都有阿达贝斯,10月30日或基斯列夫30日),则忽略该日期。

    b. 一个对象,包含 datetitlejson 和(可选的) ifNotExists。如果 date 不存在,则在 ifNotExist 中的所有日期上打印它。

  2. language - 默认语言(选项:en_UShe_IL)。

  3. location - 默认位置(选项:ChulIsrael)。

  4. exact-days - 参见上述参数部分。(选项:truefalse)。

示例

days = [
         ["10 שבט", "Yud Shvat (The Yom Hilula of the Previous Lubavitcher Rebbe)", "YudShvat"],
         ["1 אדר", "First of Adar", "1Adar"],
         ["1 אדרא", "First of Adar I", "1AdarI"],
         ["1 אדרב", "First of Adar II", "1AdarII"],
         ["30 כסלו", "30th of Kislev", "30Kislev"],
         ["30 חשוון", "30th of Cheshvan", "30 Cheshvan"],
       ]
days = [
   { date = "10 שבט", title = "Yud Shvat (The Yom Hilula of the Previous Lubavitcher Rebbe)", json = "YudShvat" },
   { date = "10 Adar2", ifNotExists = ["10 Adar"], title = "Yahrtzeit of Reb Moshe", json = "YahrtzeitRebMoshe" },
   { date = "30 Kislev", ifNotExists = ["29 Kislev", "1 Teves"], title = "This day doesn't always exist", json = "AnnoyingDay" },
   { date = "31 תשרי", ifNotExists = ["32 Adar2"], title = "Huh?", json = "HuhDay" }
]
language = "en_US"
exact-days = true

示例

以色列托拉阅读与散居犹太人有什么区别?

$ diff  <(./target/release/heca list 2019 --show shabbos) <(./target/release/heca list 2019 --location Israel --show shabbos)

16,29c16,30
< Night of 2019/5/3: Acharei Mos
< Night of 2019/5/10: Kedoshim
< Night of 2019/5/17: Emor
< Night of 2019/5/24: Behar
< Night of 2019/5/31: Bechukosai
< Night of 2019/6/7: Bamidbar
< Night of 2019/6/14: Naso
< Night of 2019/6/21: Behaaloscha
< Night of 2019/6/28: Shlach
< Night of 2019/7/5: Korach
< Night of 2019/7/12: Chukas
< Night of 2019/7/19: Balak
< Night of 2019/7/26: Pinchas
< Night of 2019/8/2: Matos/Maasei
---
> Night of 2019/4/26: Acharei Mos
> Night of 2019/5/3: Kedoshim
> Night of 2019/5/10: Emor
> Night of 2019/5/17: Behar
> Night of 2019/5/24: Bechukosai
> Night of 2019/5/31: Bamidbar
> Night of 2019/6/7: Naso
> Night of 2019/6/14: Behaaloscha
> Night of 2019/6/21: Shlach
> Night of 2019/6/28: Korach
> Night of 2019/7/5: Chukas
> Night of 2019/7/12: Balak
> Night of 2019/7/19: Pinchas
> Night of 2019/7/26: Matos
> Night of 2019/8/2: Maasei

下一次第一逾越节会在星期五晚上吗?

$ for i in `seq 5779 5900`; do echo "$i-$(date -d $(./target/release/heca --print json list $i --show minor-holidays |jq '.|.[] | select(.name == "ErevPesach") | .day' | tr -d \") '+%a')" ; done | grep "Fri"

5781-Fri
5785-Fri
5805-Fri
5808-Fri
5812-Fri
5832-Fri
5835-Fri
5839-Fri
5859-Fri
5863-Fri
5883-Fri
5890-Fri

何时将有拉比·莫西·本·米蒙和达菲·约米同时在同一天庆祝希鲁姆?

$ ./target/release/heca --print=json list 1985 --years 5000 --show daf-yomi |jq '.[] | select(.topic.masechta | contains("Berakhot")) | select(.topic.daf | contains(2)) | .day' > /tmp/siyum_daf_yomi
$ ./target/release/heca --print=json list 1985 --years 5000 --show rambam-3-chapters |jq '.[] | select(.topic[0].halacha | contains("Transmission")) | select(.topic[0].chapter | contains(1)) | .day' > /tmp/siyum_rambam_3_chapters
$ comm -12 /tmp/siyum_daf_yomi /tmp/siyum_rambam_3_chapters

"3155-08-25T18:00:00Z"
"5671-11-11T18:00:00Z"

因此,我们需要等待一段时间才能有一个团结的希鲁姆庆祝。

莫拉德何时会在一个整数的日期上?

$ ./target/release/heca --print=json list --show=shabbos-mevarchim 1020 --years 5000 |jq '. |.[] | select(.molad.minute ==0) | select(.molad.chalakim == 0) | .day'

"2092-02-01T18:00:00Z"
"2179-06-04T18:00:00Z"
"2267-09-13T18:00:00Z"
"2354-01-22T18:00:00Z"
"2441-05-17T18:00:00Z"

所以,只有七十年。

莫拉德何时会在一个真正的整数的日期上?

$ ./target/release/heca --print=json list --show=shabbos-mevarchim 1020 --years 5000 |jq '. |.[]| select(.molad.hour == 0) | select(.molad.minute ==0) | select(.molad.chalakim == 0) | .day'

"1830-02-19T18:00:00Z"
"3925-10-23T18:00:00Z"

我们需要等待一段时间,直到莫拉德正好在午夜。

基准

在我的完全不科学的基准

$ ./benchmark/bench.sh

命令 平均值 [s] 最小值 [s] 最大值 [s] 相对值
taskset-ac0-3 /tmp/heca/发布/heca--打印=常规列表3766 --年份17000 --显示逾越节-tov,次要的-假日,普通日,特殊的-篇章--没有-排序 0.474 0.471 0.483 1.00
taskset-ac0-3 /tmp/heca/发布/heca--打印=常规列表3766 --年份17000 --显示逾越节-tov,次要的-假日,普通日,特殊的-篇章 0.559 0.558 0.562 1.00
taskset-ac1 /tmp/heca/发布/heca--打印=常规列表3766 --年份17000 --显示逾越节-tov,次要的-假日,普通日,特殊的-篇章--没有-排序 0.631 0.627 0.637 1.33 ± 0.01
taskset-ac1 /tmp/heca/发布/heca--打印=常规列表3766 --年份17000 --显示逾越节-tov,次要的-假日,普通日,特殊的-篇章 0.826 0.820 0.839 1.48
taskset-ac0-3 /tmp/heca/发布/heca--打印=json列表3766 --年份17000 --显示逾越节-tov,次要的-假日,普通日,特殊的-篇章--没有-排序 0.915 0.909 0.927 1.00
taskset-ac0-3 /tmp/heca/发布/heca--打印=json列表3766 --年份17000 --显示逾越节-tov,次要的-假日,普通日,特殊的-篇章 1.001 997.1 1012.4 1.00
taskset-ac1 /tmp/heca/发布/heca--打印=json列表3766 --年份17000 --显示逾越节-tov,次要的-假日,普通日,特殊的-篇章--没有-排序 1.072 1068 1.078 1.17 ± 0.01
taskset-ac1 /tmp/heca/发布/heca--打印=json列表3766 --年份17000 --显示逾越节-tov,次要的-假日,普通日,特殊的-篇章 1.268 1260.8 1276.0 1.27 ± 0.01
命令 平均值 [s] 最小值 [s] 最大值 [s] 相对值
taskset-ac1hebcal3766 --年份17000 1.012 1.008 1.030 1.00
taskset-ac0-3hebcal3766 --年份17000 1.012 1.008 1.021 1.00

版本控制

我们使用SemVer对JSON输出的版本进行控制(尽管我们可能会在次要版本中添加新的假日)。所有其他输出可能随时更改。

许可

  • 源代码采用MIT许可证。
  • 二进制代码采用MIT + Apache-2许可证。

依赖项

~7–9.5MB
~177K SLoC