如何 rust 计时持续时间得到年数或月数?

qlfbtfca  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(291)

我对铁 rust 和超时空图书馆还是个新手。
我检查了https://docs.rs/chrono/0.4.19/chrono/struct.Duration.html#method.num_weeks,但是在时间::持续时间中没有num_years()num_months() API。
对此是否有任何变通解决方案?

icomxhvb

icomxhvb1#

chrono::Duration提供了“ISO 8601纳秒精度持续时间”中的日期和持续时间,这意味着它在内部将持续时间表示为纳秒数,然后提供了转换为其他持续时间单位(如天、周、毫秒等)的方便方法。
这与实际的ISO 8601持续时间标准有点矛盾,ISO 8601持续时间标准是一种表示和格式标准。该标准用P[n]Y[n]M[n]DT[n]H[n]M[n]S格式表示持续时间-这可能会给予您想要的结果。但这不是chronos::Duration设计时所提供的结果。
问题是,为了表示月或年的持续时间,需要比纳秒数更多的信息。持续时间定义了时间间隔中的干预时间量:两点之间的时间。2开始或结束时间很重要,因为月或年不是标准的持续时间。3月有28、29、30、31天,年有365和366天。
如果您要编写自己的算法,以年、月、日、小时、分钟、秒等格式设置持续时间,则必须知道开始日期。此外,时区也很重要,因为需要考虑夏令时。您还必须决定如何表示月或年的一部分。例如,一月有31天,比如说2月28日。从1月1日算起的1.75个月的持续时间是什么意思?这是否意味着1月是31天,而2月是0.75 * 28天?
或者,您可以使用级联单位格式表示从开始日期开始的持续时间:例如,自1970年1月1日12:00 Z起5年4个月3天2小时12分3秒。与ISO 8601标准相同。
所以,这并不是一个简单的解决方案,这完全取决于您的需求是什么。我可以理解为什么chronos:Duration的开发人员停止提供num_months()和num_years()!

hi3rlvi2

hi3rlvi22#

板条箱chronoutil提供RelativeDuration,这是 “延长时间的持续时间,以增加月和年”
示例来自docs.rs:

let one_day = RelativeDuration::days(1);
let one_month = RelativeDuration::months(1);
let delta = one_month + one_day;
let start = NaiveDate::from_ymd(2020, 1, 30);
assert_eq!(start + delta, NaiveDate::from_ymd(2020, 3, 1));

相关问题