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() / 4
或num_days() / 30
获得近似值。
在 C++ 中2020y/December + months1 == 2021y/January
。 months1
的持续时间为 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)