#duration #interval #time #date-time #stringifying

stringify_interval

将时间间隔字符串化为易于阅读的文本

1 个不稳定版本

0.1.0 2024年2月19日

#368日期和时间

MIT/Apache

39KB
1K SLoC

chrono::Duration 生成用户友好的字符串,例如 "1天,5小时和20分钟"。

可以显示年和月,但它们需要一些日期作为参考点,因为年和月的确切长度可能会有所不同。

它相当可配置。

公共 API 很受争议,并可能发生变化。

使用方法

let text = stringify_interval::without_date(
	chrono::Duration::seconds(1_234_567),
	&DisplayConfigConstant::default(),
	&Text::default(),
);
assert_eq!(text, Ok(String::from("14 days, 6 hours and 56 minutes")));

配置

每个单独的单位都可以设置一系列值,以确定何时显示。这允许它执行像自动省略秒数(对于长时间间隔)或除非间隔包含5年,否则不提及年这样的操作。当单位被省略时,间隔会四舍五入到最接近的最小单位的倍数。

每个单独的单位还可以用零填充,或者即使值为0也设置为显示。

此外,所有字符串元素都可以用 Text 结构体替换。这允许进行格式更改和一定程度本地化。对于每个单位,一个 ThresholdMap 允许设置对于哪个数字范围应该显示哪个文本。

Text 的默认值如下

Text {
	years: ThresholdMap::from_iter("years", [(1, "year"), (2, "years")]).unwrap(),
	months: ThresholdMap::from_iter("months", [(1, "month"), (2, "months")]).unwrap(),
	weeks: ThresholdMap::from_iter("weeks", [(1, "week"), (2, "weeks")]).unwrap(),
	days: ThresholdMap::from_iter("days", [(1, "day"), (2, "days")]).unwrap(),
	hours: ThresholdMap::from_iter("hours", [(1, "hour"), (2, "hours")]).unwrap(),
	minutes: ThresholdMap::from_iter("minutes", [(1, "minute"), (2, "minutes")]).unwrap(),
	seconds: ThresholdMap::from_iter("seconds", [(1, "second"), (2, "seconds")]).unwrap(),
	joiner: ", ".into(),
	final_joiner: Some(" and ".into()),
	spacer: " ".into(),
}

依赖项

~1.3–2MB
~36K SLoC