簡體   English   中英

rust chrono Duration 如何獲得年數或月數?

[英]How does rust chrono Duration get number of years or months?

我對 Rust 和 chrono 庫很陌生。

我檢查了https://docs.rs/chrono/0.4.19/chrono/struct.Duration.html#method.num_weeks ,但沒有num_years()num_months() API in chrono::Duration.

有什么解決方案可以解決這個問題嗎?

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()!

crate chronoutil提供了RelativeDuration ,它是“將 Chrono 的 Duration 延長到增加月和年”

來自 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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM