#ical #calendar #rules #rfc #pure #date #limit

bin+lib rrule

遵循 iCalendar RFC 定义的循环规则的纯 Rust 实现

40 个版本

0.13.0 2024 年 8 月 3 日
0.12.0 2024 年 4 月 4 日
0.11.0 2023 年 7 月 18 日
0.10.0 2022 年 8 月 8 日
0.3.4 2020 年 11 月 13 日

#15 in 日期和时间

Download history 4005/week @ 2024-05-04 2154/week @ 2024-05-11 2818/week @ 2024-05-18 2036/week @ 2024-05-25 2219/week @ 2024-06-01 3028/week @ 2024-06-08 2199/week @ 2024-06-15 1876/week @ 2024-06-22 1454/week @ 2024-06-29 1733/week @ 2024-07-06 1933/week @ 2024-07-13 2048/week @ 2024-07-20 1624/week @ 2024-07-27 1518/week @ 2024-08-03 1592/week @ 2024-08-10 952/week @ 2024-08-17

5,969 次每月下载
用于 7 个 crates(4 个直接使用)

MIT/Apache

495KB
13K SLoC

RRule.rs

遵循 iCalendar RFC 定义的循环规则的纯且高效的 Rust 实现。

规范

此 crate 遵循 iCalendar (RFC-5545) 规范 中的 "循环规则"。循环规则规范对应于此 crate 中的 RRule 对象。此外,它还允许通过换行符添加 "DTSTART" 属性

此 crate 允许使用 "BYEASTER" 过滤器。但这是通过功能标志 "by-easter" 进行选择的。

RRuleSet

RRuleSet 允许组合 RRule 和一些其他属性。

  • RRules 列表:允许组合多个 RRules。(并集,A ∪ B
  • RDates 列表:始终包含的日期时间组合列表。(并集,A ∪ B
  • ExRule 列表(见以下说明):允许从结果中移除的 RRules。(补集 A \ BA - B
  • ExDate 列表:始终排除的日期时间组合列表。(补集 A \ BA - B

说明:"EXRULE" 最初是 RFC 2445 的一部分,RFC 5545 取消了该规范。但 "EXRULE" 与 "RRULE" 的工作方式完全相同,只是它排除日期。您可以通过启用默认禁用的 "exrule" 功能标志来启用 "EXRULE"。

如果您发现实现与上述规范不同,请打开一个问题。

库使用

use rrule::RRuleSet;

// RRule that starts 2012.02.01 and occurs daily for 3 days.
let rrule: RRuleSet = "DTSTART:20120201T093000Z\nRRULE:FREQ=DAILY;COUNT=3".parse().unwrap();

// Set hard limit in case of infinitely recurring rules.
let limit = 100;
// Get all recurrences of the rrule
let result = rrule.all(limit);
assert_eq!(result.dates.len(), 3);

更多示例请参阅 docs.rs

命令行工具使用

使用以下命令安装命令行工具

cargo install rrule --features="cli-tool"

然后运行它

rrule "DTSTART:20120201T093000Z\nRRULE:FREQ=DAILY;COUNT=3"

安全性

如果您使用来自用户的任意输入来构建重复规则,请阅读 安全文档

限制和限制

由于 Chrono 的限制,所有日期都限制在范围或年 +/ -262_000[^1] 内。有关更多信息,请参阅 Chrono 的限制

支持的时间区域限制为 Chrono-Tz 支持的时间区域。这相当于 IANA 数据库。有关更多信息,请参阅 Chrono-Tz 的限制

验证限制

由于规范提供了很多灵活性,这可以很容易地被 滥用。为了防止大部分滥用,我们在 RRuleSet::all 方法上施加了任意限制。验证限制不会对 RRuleSet::all_unchecked 方法或直接使用 Iterator api 进行强制执行。

限制

描述 任意限制 包限制
年范围 -10_000..=10_000 -262_000..=262_000 (Chrono)
最大间隔(按年频率) 10_000 (10000 年) 65_535 (u16::MAX)
最大间隔(按月频率) 1_000 (~83 年) 65_535 (u16::MAX)
最大间隔(按周频率) 1_000 (~19 年) 65_535 (u16::MAX)
最大间隔(按日频率) 10_000 (~27 年) 65_535 (u16::MAX)
最大间隔(按小时频率) 10_000 (~416 天) 65_535 (u16::MAX)
最大间隔(按分钟频率) 10_000 (~7 天) 65_535 (u16::MAX)
最大间隔(按秒频率) 50_000 (~13 小时) 65_535 (u16::MAX)
迭代限制 100_000 4_294_967_295 (u32::MAX)

默认情况下,使用 "任意限制"。如果您想使用 "包限制",请确保您 了解与此相关的风险

受以下启发

许可证

本项目中代码的许可证为 MITApache 2.0 许可证。

对本项目的所有贡献都将使用类似的许可证。

[^1]: 有关更多信息,请参阅 验证限制 部分。

依赖项

~4.5–7MB
~114K SLoC