2 个不稳定版本
| 0.2.0 | 2024年2月8日 |
|---|---|
| 0.1.0 | 2024年2月8日 |
#222 in 日期和时间
20KB
469 行
将类似于 "5y6mo" 和 "3.5 分钟" 的字符串解析为 chrono::Duration。它旨在为基于文本的用户输入提供快速简单的解决方案,例如安排提醒或其他事件。
它在年份和月份的可变持续时间方面是可靠的。例如,从 2000-02-01(闰年的二月)开始,1 个月表示 29 天,-1 个月表示 -31 天。
用法
let duration = parse_interval::with_now("2 days 15 hours 15 mins");
assert_eq!(duration, Ok(chrono::Duration::seconds(227700)));
let duration = parse_interval::with_lazy_date("1 month", || {
NaiveDate::from_ymd_opt(2000, 2, 1)
.unwrap()
.and_time(NaiveTime::default())
.and_utc()
});
assert_eq!(duration, Ok(chrono::Duration::days(29)));
输入格式设计得相对灵活,但有一套特定的、有偏见的规则。
格式如下
<数字>年<数字>月<数字>周<数字>天<数字>小时<数字>分钟<数字>秒
每个单位都是可选的,但所有现有的单位都需要按顺序排列。所有单位均不区分大小写。所有空格都是可选的,并允许存在多余的空格。年和月的数字不能有小数,但其他单位的数字可以。单位的组合不需要有意义,例如 "1 周 20 天" 将简单地是 27 天,而 ".5d12h" 将简单地是 1 天。它也不进行语法验证,因此会接受 "1 weeks 20 day"。
years也可以写作year或ymonths也可以写作month或moweeks也可以写作week或wdays也可以写作day或dhours也可以写作hour、hrs、hr或hminutes也可以写作minute、mins、min或mseconds也可以写成second、secs、sec或s
可以在任何数字前插入一个 - 来减去其后的所有单位。另一个 - 将使后面的单位再次变为可加(就像是从之前的减法中减去一样)。例如,"1d - 10m 30s" 描述的是一个比一天短 10.5 分钟的时间间隔。"1d - 10m - 30s" 描述的是一个比一天短 9.5 分钟的时间间隔。整个时间间隔可以是负数,从而得到一个负的 Duration。
由于年和月的实际持续时间各不相同,为了处理它们,需要选择一些日期作为起点。可以提供一个 DateTime<Utc> 用于此目的,或者库可以使用当前系统时间。也可以选择根本不处理年和月。
依赖项
~3.5–5MB
~88K SLoC