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
或y
months
也可以写作month
或mo
weeks
也可以写作week
或w
days
也可以写作day
或d
hours
也可以写作hour
、hrs
、hr
或h
minutes
也可以写作minute
、mins
、min
或m
seconds
也可以写成second
、secs
、sec
或s
可以在任何数字前插入一个 -
来减去其后的所有单位。另一个 -
将使后面的单位再次变为可加(就像是从之前的减法中减去一样)。例如,"1d - 10m 30s" 描述的是一个比一天短 10.5 分钟的时间间隔。"1d - 10m - 30s" 描述的是一个比一天短 9.5 分钟的时间间隔。整个时间间隔可以是负数,从而得到一个负的 Duration
。
由于年和月的实际持续时间各不相同,为了处理它们,需要选择一些日期作为起点。可以提供一个 DateTime<Utc>
用于此目的,或者库可以使用当前系统时间。也可以选择根本不处理年和月。
依赖项
~3.5–5MB
~88K SLoC