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

问题描述 投票:1回答:1

[我正在处理一些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天

例如,将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,只是花了几天的时间而已,而我并没有太多阅读源代码。我确实看过它,但是由于我对这种语言的有限了解而难以理解。

rust duration rust-chrono
1个回答
0
投票

A Duration是一个时间量。添加到即时信息中的时间没有多少,因此第二天总是产生相同的时间,因为您已经注意到,日历日可能会有不同的时间。

不仅是年,周,日,甚至数小时和分钟也不一定总是具有相同的时间(Leap second)。 Duration是时间量,不是“日历单位”。因此,不,Duration无法表达“下周相同时间”之类的想法。

表达“第二天相同时间”的最简单方法是使用succ上的and_timeDate方法:

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

[and_time将在新日期不存在时间时惊慌。

© www.soinside.com 2019 - 2024. All rights reserved.