【发布时间】:2020-11-08 13:32:03
【问题描述】:
我想以这种格式获得今天08/11/2020 和01/01/1970 之间的“时间跨度”差异:
Timespan:
50 year(s) 10 month(s) 7 day(s)
下面的代码正确计算了:today - 01/01/1970。但是,对于像 23/12/1970 给予这样的输入,它会惨遭失败:
50 year(s) -1 month(s) -15 day(s)
而预期的结果是49 year(s) 10 month(s) 16 day(s)。
更多测试日期:
-
09/01/1985得到:
35 year(s) 10 month(s) -1 day(s)但预期为35 year(s) 9 month(s) 30 day(s)。 -
24/02/1936得到:
84 year(s) 9 month(s) -16 day(s)但预期为84 year(s) 8 month(s) 15 day(s)。
Cargo.toml:
[package]
name = "relative-delta"
version = "0.1.0"
authors = ["baduker"]
edition = "2018"
[dependencies]
chrono = "0.4.19"
代码:
use chrono::{NaiveDateTime, DateTime, Utc, Datelike};
fn main() {
let date_string = "23/12/1970";
let naive_date = chrono::NaiveDate::parse_from_str(date_string, "%d/%m/%Y").unwrap();
let naive_datetime: NaiveDateTime = naive_date.and_hms(0, 0, 0);
let date = DateTime::<Utc>::from_utc(naive_datetime, Utc);
let years = Utc::now().year() - date.year();
let months = Utc::now().month() as i64 - date.month() as i64;
let days = Utc::now().day() as i64 - date.day() as i64;
println!("Timespan:\n{} year(s) {} month(s) {} day(s)", years, months, days);
}
【问题讨论】:
-
注意:
Utc::now()可以在计算过程中切换日期。在玩弄时间时,重要的是要非常明确地说明何时创建一个新时间,并避免重复创建它们。 -
我认为您的问题与以下问题有关,尚未实施。 github.com/chronotope/chrono/issues/416也许你可以和维护者一起在 GitHub 上参与。
-
Utc::now().month() as i64 - date.month() as i64;你是否希望这总是非负数,如果是这样,应该用什么样的黑魔法来负责?