我正在处理一些适用于天数的 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 天。
例如,将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,现在才使用它几天,而且我没有太多阅读源代码。我确实看过它,但由于我对语言的熟悉程度有限,很难理解。