如何使用 Rust chrono 获得 1 天的持续时间?

Ian*_*Ian 5 duration rust 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);
Run Code Online (Sandbox Code Playgroud)

同样,Duration:days(1)不是这样的函数,因为它返回1 * 24 * 60 * 60seconds 而不是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);
Run Code Online (Sandbox Code Playgroud)

返回:

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
Run Code Online (Sandbox Code Playgroud)

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

我可以得到正确的结果:

let one_day_later =
    (start.date() + Duration::days(1)).and_hms(start.hour(), start.minute(), start.second());
Run Code Online (Sandbox Code Playgroud)

但我更喜欢一个返回天数持续时间的函数,并且一般想了解更多关于 Rust Chrono 处理持续时间的功能。它是否具有秒以外的单位的持续时间?那么周、月和年呢,它们的秒数也是可变的。

我应该说我不知道​​ Rust,现在只使用了几天,而且我没有太多阅读源代码。我确实看过它,但由于我对语言的熟悉程度有限,发现它很难理解。

tre*_*tcl 5

ADuration是时间量。没有多少时间当添加到一个瞬间时,总是在第二天产生相同的时间,因为正如您所注意到的,日历日可能有不同的时间量。

不仅年、周和天,甚至小时和分钟也不总是包含相同的时间量(闰秒)。ADuration是时间量,而不是“日历单位”。所以不,aDuration不能表达“下周同一时间”这样的想法。

表达“第二天同一时间”的最简单方法是使用succand_time方法Date

let one_day_later = start.date().succ().and_time(start.time());
Run Code Online (Sandbox Code Playgroud)

and_time 如果时间在新日期不存在,则会发生恐慌。