4 个版本
0.0.4 | 2019年6月18日 |
---|---|
0.0.3 | 2019年4月16日 |
0.0.2 | 2019年4月3日 |
0.0.1 | 2019年4月2日 |
在 #ical 中排名 24
61KB
1.5K SLoC
Sundial
Sundial 是一个用纯 Rust 编写的库,部分实现了 Rust,以支持 RRules 的解析。
本项目当前支持的高级功能
-
将 RRule 解析为 json 表示形式的能力
-
从给定的 json 中提取 RRule 实现的能力
-
根据 RRule 字符串生成下一次/多次迭代的能力
RFC5545 规范功能支持
由于该库目前仅设计用于支持规范中 RRules 部分,因此将为每种 RRule 支持类型逐步添加功能(注意:所有频率类型都完全支持:COUNT、INTERVAL、DTSTART 和 UNTIL)
RRULE 频率 | 支持的 RRule 部分 |
---|---|
YEARLY | BYHOUR, BYMINUTE, BYSECOND |
MONTHLY | BYMONTH, BYMONTHDAY, BYHOUR, BYMINUTE, BYSECOND |
WEEKLY | BYDAY, BYHOUR, BYMINUTE, BYSECOND |
DAILY | BYDAY, BYMONTH, BYHOUR, BYMINUTE, BYSECOND |
HOURLY | BYDAY, BYMONTH, BYHOUR, BYMINUTE, BYSECOND |
MINUTELY | BYDAY, BYMONTH, BYHOUR, BYMINUTE, BYSECOND |
SECONDLY | BYDAY, BYMONTH, BYHOUR, BYMINUTE |
通过 chrono_tz 提供时区支持,并且自动支持 chrono_tz 中的所有时区。目前此库不支持自定义时区。
用法
该软件包编译成原生二进制文件,可以作为简单的系统调用运行。
查看帮助
./sundial -h
从 rrule 字符串解析并获取迭代日期
./sundial --rrule 'Enter your rrule string here'
例如,运行以下命令
./sundial 'FREQ=WEEKLY;INTERVAL=2;COUNT=12;BYHOUR=0;BYMINUTE=0;DTSTART=20190101T030000'
将得到以下结果
[
"2019-01-15T00:00:00+00:00",
"2019-01-29T00:00:00+00:00",
"2019-02-12T00:00:00+00:00",
"2019-02-26T00:00:00+00:00",
"2019-03-12T00:00:00+00:00",
"2019-03-26T00:00:00+00:00",
"2019-04-09T00:00:00+00:00",
"2019-04-23T00:00:00+00:00",
"2019-05-07T00:00:00+00:00",
"2019-05-21T00:00:00+00:00",
"2019-06-04T00:00:00+00:00",
"2019-06-18T00:00:00+00:00"
]
我们还支持指定 count 和 until 作为可选的命令行参数(请注意,如果提供的 rrule 字符串包含任何内容,这些将覆盖 COUNT 和 UNTIL 部分)
./sundial --rrule <rrule_string> -ct 25 -ul 20220123T030000
或者
./sundial --rrule <rrule_string> --count 25 --until 20220123T030000
这将给出由 25 或 23/12/2022 3 点 UTC 之间的 count 值或直到最早的那个结果。
请注意,我们目前仅支持将 until 值参数解析为 UTC 日期。
使用日期截止日期
日晷支持指定给定的 rrule 字符串可能没有更新的 DTSTART
部分,并且我们希望使用当前日期作为截止日期。
这可以通过添加可选的 --cutoff
命令行参数来实现。
例如:
如果我们午夜运行 2019 年 4 月 15 日
./sundial FREQ=WEEKLY;INTERVAL=1;COUNT=3;BYDAY=TU;BYHOUR=23;BYMINUTE=54;BYSECOND=0;TZID=Australia/Melbourne;DTSTART=20180110T034500
未指定截止参数,日晷将假设 DTSTART(2019 年 1 月 10 日)为开始发送结果的日期,这将给我们
["2018-01-16T23:54:00+11:00", "2018-01-23T23:54:00+11:00", "2018-01-30T23:54:00+11:00"]
然而,如果我们指定截止参数
./sundial FREQ=WEEKLY;INTERVAL=1;COUNT=3;BYDAY=TU;BYHOUR=23;BYMINUTE=54;BYSECOND=0;TZID=Australia/Melbourne;DTSTART=20180110T034500 --cutoff
日晷将继续计算,直到我们从一个大于或等于当前运行日期(在本例中为 2019 年 4 月 15 日午夜)的日期开始,并从该日期开始发送日期计数,从而得到
["2019-04-16T23:54:00+10:00", "2019-04-23T23:54:00+10:00", "2019-04-30T23:54:00+10:00"]
运行测试
要从存储库根目录运行完整的测试套件
$ cargo test --all
请使用。
有用资源
依赖项
~9–18MB
~250K SLoC