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 在 日期和时间
66 每月下载量
7MB
4K SLoC
heca
用 Rust 编写的希伯来日历。它可以将希伯来历转换为公历并反向转换,并列出犹太节日。
安装
直接
您可以从 发布页面 下载 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]
选项
--config
:设置配置文件。有关更多信息,请参阅配置部分。如果未设置,它将尝试读取$XDG_CONFIG_HOME/heca/config.toml
)。--language
:设置输出语言。选项为希伯来语(he_IL)或英语(en_US)。如果未设置,它将尝试从LANG
环境变量中获取您的语言。如果LANG
未设置(或设置为非he_IL
的内容),则默认为英语。--print
:将结果以 JSON、常规或美化格式打印出来(目前别名常规)。
子命令
转换
heca convert [OPTIONS] <Date>
选项
--datefmt <DateFormat>
:设置日期格式(仅适用于公历):US 或 M 为 mm/dd/yyyy,UK 或 L 为 dd/mm/yyyy,ISO 或 B 为 yyyy/mm/dd。默认为 ISO。--type <T>
:强制从类型 T 转换,其中 T 是 "hebrew"(日期必须写成 '5/אדרא/5779'),"gregorian"(日期必须写成 '1996/12/19'),或模糊(如果年份大于 4000,则假定希伯来语,否则为公历。它还尝试在希伯来月份的拼写和顺序上进行模糊匹配)。默认为fuzzy
。
列表
heca list [FLAGS] [OPTIONS] <Year>
重要提示
由于犹太日从夜晚开始,与大多数日历不同,列出的日期是 开始 日期,而不是结束日期。因此,如果第一个逾越节是在周五晚上,我将会输出逾越节的开始是周五,而不是安息日。
选项
-
--no-sort
:不排序输出。如果您只想查找某个特定日期,这很有用。也可以通过设置
HECA_NOSORT=1
来配置。 -
--years <AmountYears>
:生成n年的事件。默认值为1。 -
--show <Events>
:列出哪些事件。可能的值有yom-tov
- 列出主要节日 - 罗什哈沙纳、赎罪日、逾越节、五旬节和住棚节。shabbos
- 列出每周的托拉段落。special-parshas
- 列出冬季阅读的四个特殊托拉段落。chol
- 显示有特殊托拉阅读的平日 - 包括舒什安普里姆。minor-holidays
- 拉格巴欧默、赎罪节第二日和逾越节前夕。omer
- 列出奥梅尔。custom-holidays
- 列出配置文件中的日期。daf-yomi
- 列出每日达夫·约米。yerushalmi-yomi
- 列出每日耶路撒冷日。rambam-3-chapters
- 列出每日拉姆巴姆(每天3章)。rambam-1-chapter
- 列出每日拉姆巴姆(每天1章)。israeli-holidays
- 列出hebcal显示的以色列节日(耶路撒冷日、西格德、大屠杀纪念日、以色列独立日和耶路撒冷日)。chabad-holidays
- 列出查巴德不读塔哈努恩的日期(10基斯列夫、19/20基斯列夫和12/13塔穆兹)。shabbos-mevarchim
- 列出下个月即将到来的安息日梅瓦尔钦。它还会输出朔望(新月)的时间。
默认是
yom-tov
。 -
--location
:选择您是在寻找以色列日历还是犹太日历。选项是 "Chul" 或 "Israel"。默认为Chul,除非语言是希伯来语,在这种情况下默认为Israel。也可以通过HECA_LOCATION
进行配置。 -
--type
:强制从类型T转换,其中T是 "hebrew"(然后日期必须写成 '5/אדרא/5779'),"gregorian"(日期必须写成 '1996/12/19'),或模糊(如果年份在4000年以上,则假设为希伯来语,否则为公历。它还在希伯来月拼写和顺序上尝试模糊)。默认为fuzzy
。也可以通过
HECA_YEAR_TYPE
进行配置。 -
--exact-days
:拉比法庭、阿哈龙·索洛维奇克拉比和赫舍尔·沙赫特拉比之间存在争议。拉比法庭表示,如果这些日子在安息日附近,我们应该将它们移动,以免导致人们违反安息日。而阿哈龙·索洛维奇克拉比和赫舍尔·沙赫特拉比表示,在美国,人们应该始终在给定那天庆祝。此选项覆盖了拉比法庭的默认裁决。也可以通过
HECA_EXACT_DAYS
进行配置。
配置文件
配置是一个TOML文件,包含几个选项
-
days - 一个数组。可以是
a. 已弃用:一个三个元素的数组。第一个是希伯来日,第二个是在美观打印时输出的字符串,第三个是在JSON打印时输出的字符串。如果日期在某年不存在(例如,并非所有年份都有阿达贝斯,10月30日或基斯列夫30日),则忽略该日期。
b. 一个对象,包含
date
、title
、json
和(可选的)ifNotExists
。如果date
不存在,则在ifNotExist
中的所有日期上打印它。 -
language
- 默认语言(选项:en_US
或he_IL
)。 -
location
- 默认位置(选项:Chul
或Israel
)。 -
exact-days
- 参见上述参数部分。(选项:true
或false
)。
示例
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