#ical #cli #rrule #utiltiy #rrule-processing #date-time-utility

bin+lib sundial

纯Rust库,用于解析和处理iCalendar RRules

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

MIT 许可证

61KB
1.5K SLoC

Sundial

crates.io crates.io Build Status

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