[英]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
類型兼容? 並非所有的日子都是相同的秒數。 seconds
和days
是完全不同的單位。 如果有這樣的函數,那么下面的結果總是會在第二天的同一時間給出?
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
上的succ
和and_time
方法:
let one_day_later = start.date().succ().and_time(start.time());
如果時間在新日期不存在, and_time
會恐慌。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.