簡體   English   中英

如何使用 Rust chrono 獲得 1 天的持續時間?

[英]How to get a duration of 1 day with Rust chrono?

我正在處理一些適用於幾天的 Rust 代碼,但Duration::days(n)是,根據文檔n * 24 * 60 * 60秒,這不是 n 天,因為並非所有的天都是24 * 60 * 60秒。

這種行為有據可查:

pub fn days(days: i64) -> Duration

使用給定的天數創建一個新的Duration 相當於Duration::seconds(days * 24 * 60 * 60)帶有溢出檢查。 當持續時間超出范圍時出現恐慌。

Rust Chrono 有沒有辦法獲得嚴格來說是 1 天而不是幾秒的持續時間,並且與DateTime類型兼容? 並非所有的日子都是相同的秒數。 secondsdays是完全不同的單位。 如果有這樣的函數,那么下面的結果總是會在第二天的同一時間給出?

let start = Local.now();
let one_day_later = start + function_that_returns_a_duration_of_days(1);

同樣, Duration:days(1)不是這樣的函數,因為它返回1 * 24 * 60 * 60秒,而不是1 day

例如,將TZ設置為America/Denver如下:

let start = Local.ymd(2019, 3, 10).and_hms(0, 0, 0);
println!("start: {}", start);
let end = Local.ymd(2019, 3, 11).and_hms(0, 0, 0);
println!("end: {}", end);
let elapsed_seconds = end.timestamp() - start.timestamp();
println!("elapsed_seconds: {}", elapsed_seconds);
let end2 = start + Duration::days(1);
println!("end2: {}", end2);
let elapsed_seconds2 = end2.timestamp() - start.timestamp();
println!("elapsed_seconds2: {}", elapsed_seconds2);

返回:

start: 2019-03-10 00:00:00 -07:00
end: 2019-03-11 00:00:00 -06:00
elapsed_seconds: 82800
end2: 2019-03-11 01:00:00 -06:00
elapsed_seconds2: 86400

它增加了86400 秒,而不是1 天

我可以得到正確的結果:

let one_day_later =
    (start.date() + Duration::days(1)).and_hms(start.hour(), start.minute(), start.second());

但我更喜歡一個返回天數持續時間的函數,並且一般想了解更多關於 Rust Chrono 處理持續時間的功能。 它是否具有秒以外的單位的持續時間? 那么周、月和年呢,它們的秒數也是可變的。

我應該說我不知道​​ Rust,現在只使用了幾天,而且我沒有太多閱讀源代碼。 我確實看過它,但由於我對語言的熟悉程度有限,發現它很難理解。

Duration是一段時間。 沒有多少時間當添加到一個瞬間時,總是在第二天產生相同的時間,因為正如您所注意到的,日歷日可能有不同的時間量。

不僅年、周和天,甚至小時和分鍾也不總是包含相同的時間量(閏秒)。 Duration是時間量,而不是“日歷單位”。 所以不, Duration不能表達“下周同一時間”這樣的想法。

表達“第二天同一時間”的最簡單方法是使用Date上的succand_time方法:

let one_day_later = start.date().succ().and_time(start.time());

如果時間在新日期不存在, and_time會恐慌。

暫無
暫無

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

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