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 日期和时间
5,969 次每月下载
用于 7 个 crates(4 个直接使用)
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 \ B
或A - B
) - ExDate 列表:始终排除的日期时间组合列表。(补集
A \ B
或A - 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) |
默认情况下,使用 "任意限制"。如果您想使用 "包限制",请确保您 了解与此相关的风险。
受以下启发
许可证
本项目中代码的许可证为 MIT 或 Apache 2.0 许可证。
对本项目的所有贡献都将使用类似的许可证。
[^1]: 有关更多信息,请参阅 验证限制 部分。
依赖项
~4.5–7MB
~114K SLoC