rust chrono Duration 如何获得年数或月数?

Posted

技术标签:

【中文标题】rust chrono Duration 如何获得年数或月数?【英文标题】:How does rust chrono Duration get number of years or months? 【发布时间】:2022-01-22 14:28:37 【问题描述】:

我对 Rust 和 chrono 库还很陌生。

我检查了 https://docs.rs/chrono/0.4.19/chrono/struct.Duration.html#method.num_weeks,但 chrono::Duration 中没有 num_years()num_months() API。

有什么解决办法吗?

【问题讨论】:

请注意,以月表示持续时间并没有任何意义,因为月份有不同的长度。您可以使用num_weeks() / 4num_days() / 30 获得近似值。 在 C++ 中2020y/December + months1 == 2021y/Januarymonths1 的持续时间为 1 个月。 @HowardHinnant 现在试试2020y/February/1 + months1 == 2020y/March/1。在 C++ 中,months1 is a duration of 2629746s 或 30.437 天可能会产生意想不到的结果。 不应该是2020y/March/1 吗?这就是我得到的。更多信息在这里:***.com/a/43018120/576911 【参考方案1】:

chrono::Duration 在“具有纳秒精度的 ISO 8601 持续时间”中提供日期和持续时间,这意味着它在内部将持续时间表示为纳秒数,然后提供方便的方法来转换为其他持续时间单位,例如天、周、毫秒等。

这与实际的 ISO 8601 持续时间标准有些不同,后者是一种表示和格式的标准。该标准以 P[n]Y[n]M[n]DT[n]H[n]M[n]S 格式表示持续时间——这可能会给你你想要的。但这不是 chronos::Duration 旨在提供的。

问题在于,为了表示数月或数年的持续时间,需要比纳秒数更多的信息。持续时间定义了时间间隔中的干预时间量:两点之间的时间。开始或结束时间很重要,因为月或年不是标准持续时间。月份有 28 天、29 天 30 天、31 天,年份有 365 天和 366 天。

如果您要编写自己的算法来以年、月、日、小时、分钟、秒等形式格式化持续时间。您必须知道开始日期。此外,时区也很重要,因为需要考虑夏令时。您还必须决定如何表示月份或年份的一部分。例如,一月有 31 天,二月 28 日。表示从 1 月 1 日开始的 1.75 个月的持续时间是什么意思?这是否意味着 1 月 31 天,然后 2 月 0.75 * 28 天?

或者您可以以级联单位格式表示从开始日期开始的持续时间:例如,从 1970 年 1 月 1 日 12:00Z 开始的 5 年 4 个月 3 天 2 小时 12 分 3 秒。就像 ISO 8601 标准一样。

因此,这不是一个简单的解决方案,这完全取决于您的要求。我可以理解为什么 chronos:Duration 的开发者不再提供 num_months() 和 num_years()!

【讨论】:

以上是关于rust chrono Duration 如何获得年数或月数?的主要内容,如果未能解决你的问题,请参考以下文章

std::chrono::duration_cast - 比纳秒更精确的单位?

将chrono :: duration转换为字符串或C字符串

`chrono::DateTime<chrono::Utc>` 没有实现特征`std::ops::Add<std::time::Duration>`

Rust Chrono 解析日期字符串、ParseError(NotEnough) 和 ParseError(TooShort)

rust-chrono 中的 ParseError(NotEnough) 是啥意思?

C++ 使用 chrono 库处理日期和时间