4

我正在使用chrono crate 并想计算Duration两个DateTimes 之间的值。

use chrono::Utc;
use chrono::offset::TimeZone;

let start_of_period = Utc.ymd(2020, 1, 1).and_hms(0, 0, 0);
let end_of_period = Utc.ymd(2021, 1, 1).and_hms(0, 0, 0);

// What should I enter here?
//
// The goal is to find a duration so that
// start_of_period + duration == end_of_period
// I expect duration to be of type std::time
let duration = ... 

let nb_of_days = duration.num_days();
4

2 回答 2

6

DateTimeimplements Sub<DateTime>,所以你可以从第一个日期中减去最近的日期:

let duration = end_of_period - start_of_period;
println!("num days = {}", duration.num_days());
于 2020-04-05T10:19:55.813 回答
4

查看 Utc 的文档:https ://docs.rs/chrono/0.4.11/chrono/offset/struct.Utc.html

通过调用方法.now(或.today),您将返回一个实现的结构Sub<Date<Tz>> for Date<Tz>,从源代码中您可以看到它正在返回一个OldDuration,这只是 . 周围的类型别名Duration

最后,您可以将Duration与实现它的其他类型一起使用Add,例如DateTime.

所以代码应该是这样的:

let start_of_period = Utc.ymd(2020, 1, 1).and_hms(0, 0, 0);
let end_of_period = Utc.ymd(2021, 1, 1).and_hms(0, 0, 0);

let duration = end_of_period.now() - start_of_period.now();
于 2020-04-05T10:20:55.967 回答