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

标签 rust duration rust-chrono

我正在处理一些适用于天数持续时间的 Rust 代码,但根据文档,Duration::days(n) 的实现是n * 24 * 60 * 60 秒,这不是 n 天,因为并非所有天都是 24 * 60 * 60 秒。

此行为有详细记录:

pub fn days(days: i64) -> Duration

Makes a new Duration with given number of days. Equivalent to Duration::seconds(days * 24 * 60 * 60) with overflow checks. Panics when the duration is out of bounds.

Rust Chrono 有没有办法获得严格来说是 1 天而不是秒数的持续时间,并且与 DateTime 类型兼容?并非所有日子的秒数都相同。 是完全不同的单位。如果有这样的函数,那么下面的结果总是会给出第二天同一时间的结果?

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 设置为 美国/丹佛,如下:

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 是一段时间。添加到某个瞬间时,并不总是会在第二天产生相同的时间,因为正如您所注意到的,日历日中可能有不同的时间量。

不仅年、周和日,甚至小时和分钟也不总是包含相同的时间量 ( Leap second )。 Duration 是一段时间,而不是“日历单位”。所以不,Duration 无法表达“下周同一时间”之类的想法。

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

let one_day_later = start.date().succ().and_time(start.time());
如果新日期上的时间不存在,

and_time 将出现紧急情况。

关于rust - 如何使用 Rust chrono 获得 1 天的持续时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59662500/

相关文章:

PHP限制音频文件时长?

c++ - 为什么 C++ 引入 duration_cast 而不是使用 static_cast?

datetime - 如何将 chrono DateTime 设置为特定日期和时间?

rust - 获取指定时区的当前时间

rust - 如何让 Rust 函数传播状态?

rust - 如何返回一个常量值?

rust - 如何仅比较从同一父对象创建的对象?

animation - 您如何更改 didUpdateWidget 上 flutter 动画的持续时间?

date - 为什么我的 RFC 2822 日期没有被 chrono 解析?

rust - 如何创建带有类型删除键的 HashMap?