【问题标题】:How do I get Duration from two DateTime / NaiveDateTime?如何从两个 DateTime / NaiveDateTime 中获取 Duration?
【发布时间】:2018-04-04 18:40:44
【问题描述】:

我正在使用 chrono crate

我在i64 有约会,我可以通过NaiveDateTime::from_timestamp 得到NaiveDateTime

我有Local::now() 当前时间,我可以通过.timestamp() 获得i64

但我仍然不明白如何获得my_time - current_timeDuration,因为它表明如果我这样尝试,Sub 就没有实现

如果我在 i64 时间戳中得到差异,如何将其转换为 Duration

例如我想要类似的东西,但 sub 没有在那里实现

let uEnd = NaiveDateTime::from_timestamp(end64, 0);
let dtEnd = uEnd.sub(Local::now());

【问题讨论】:

  • 作为旁注,请考虑 Rust 的 naming conventions。局部变量名最好使用snake_case。
  • 顺便说一下,Sub 在 chrono 的情况下用于其他用途(UTC 偏移量)。您不能减去两个瞬间并获得持续时间。 Related question

标签: rust


【解决方案1】:

这两种日期时间类型不兼容,因为NaiveDateTime 缺少时区。在这种情况下,由于是使用NaiveDateTime::from_timestamp获取的,所以可以先将其转换为DateTime<Utc>,然后再获取与signed_duration_since的差异。

let now = Local::now();
let naive_dt = NaiveDate::from_ymd(2018, 3, 26).and_hms(10, 02, 0);
let other_dt = DateTime::<Utc>::from_utc(naive_dt, Utc);

let diff = now.signed_duration_since(other_dt);

Playground


chrono 的未来版本(0.4.1 之后)将支持减法作为调用 .signed_duration_since 的替代方法,只要两个操作数具有相同的时区类型。 PR #237因此,最终可以写成这样:

let diff = now.with_timezone(&Utc) - other_dt;

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    相关资源
    最近更新 更多