2 个不稳定版本

0.2.0 2024年2月8日
0.1.0 2024年2月8日

#222 in 日期和时间

MIT/Apache

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 也可以写作 yeary
  • months 也可以写作 monthmo
  • weeks 也可以写作 weekw
  • days 也可以写作 dayd
  • hours 也可以写作 hourhrshrh
  • minutes 也可以写作 minuteminsminm
  • seconds 也可以写成 secondsecssecs

可以在任何数字前插入一个 - 来减去其后的所有单位。另一个 - 将使后面的单位再次变为可加(就像是从之前的减法中减去一样)。例如,"1d - 10m 30s" 描述的是一个比一天短 10.5 分钟的时间间隔。"1d - 10m - 30s" 描述的是一个比一天短 9.5 分钟的时间间隔。整个时间间隔可以是负数,从而得到一个负的 Duration

由于年和月的实际持续时间各不相同,为了处理它们,需要选择一些日期作为起点。可以提供一个 DateTime<Utc> 用于此目的,或者库可以使用当前系统时间。也可以选择根本不处理年和月。

依赖项

~3.5–5MB
~88K SLoC