如何使用 Rust chrono 获得 1 天的持续时间?
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
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
类型兼容?并非所有的日子都是相同的秒数。 seconds
和 days
是完全不同的单位。如果有这样的功能,那么下面的结果总是会在第二天的同一时间给出结果?
let start = Local.now();
let one_day_later = start + function_that_returns_a_duration_of_days(1);
同样,Duration:days(1)
不是这样的函数,因为它是 returns 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);
Returns:
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());
但我更喜欢 returns 几天持续时间的函数,并且通常想了解更多关于 Rust Chrono 处理持续时间的功能。它是否具有秒以外的单位的持续时间?周、月和年呢,它们的秒数也是可变的。
我可能应该说我不了解 Rust,现在才使用它几天,而且我没有太多阅读源代码。我也看过了,但由于我对语言的了解有限,所以很难看懂。
一个Duration
是一个时间量。当添加到瞬间时,没有多少时间总是在第二天产生相同的时间,因为正如您所注意到的,日历日可能有不同的时间。
不仅年、周和日,甚至小时和分钟也不总是包含相同的时间量 (Leap second)。 Duration
是时间量,而不是 "calendar unit"。所以不,Duration
无法表达像 "same time next week".
这样的想法
表达 "same time next day" 的最简单方法是在 Date
上使用 succ
和 and_time
方法:
let one_day_later = start.date().succ().and_time(start.time());
and_time
如果新日期的时间不存在,将会出现 panic。
我正在处理一些适用于几天持续时间的 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 toDuration::seconds(days * 24 * 60 * 60)
with overflow checks. Panics when the duration is out of bounds.
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)
不是这样的函数,因为它是 returns 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);
Returns:
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());
但我更喜欢 returns 几天持续时间的函数,并且通常想了解更多关于 Rust Chrono 处理持续时间的功能。它是否具有秒以外的单位的持续时间?周、月和年呢,它们的秒数也是可变的。
我可能应该说我不了解 Rust,现在才使用它几天,而且我没有太多阅读源代码。我也看过了,但由于我对语言的了解有限,所以很难看懂。
一个Duration
是一个时间量。当添加到瞬间时,没有多少时间总是在第二天产生相同的时间,因为正如您所注意到的,日历日可能有不同的时间。
不仅年、周和日,甚至小时和分钟也不总是包含相同的时间量 (Leap second)。 Duration
是时间量,而不是 "calendar unit"。所以不,Duration
无法表达像 "same time next week".
表达 "same time next day" 的最简单方法是在 Date
上使用 succ
和 and_time
方法:
let one_day_later = start.date().succ().and_time(start.time());
and_time
如果新日期的时间不存在,将会出现 panic。