对于`chrono :: DateTime <chrono :: utc>,没有实现特性`std :: ops :: Add <std :: time :: duration>`

时间:2018-05-01 21:45:35

标签: rust rust-chrono

extern crate chrono;
use chrono::{DateTime, Utc};
use std::time::Duration;

pub fn after(start: DateTime<Utc>) -> DateTime<Utc> {
    start + Duration::from_secs(1)
}

失败了:

error[E0277]: cannot add `std::time::Duration` to `chrono::DateTime<chrono::Utc>`
 --> src/lib.rs:7:11
  |
7 |     start + Duration::from_secs(1_000_000_000)
  |           ^ no implementation for `chrono::DateTime<chrono::Utc> + std::time::Duration`
  |
  = help: the trait `std::ops::Add<std::time::Duration>` is not implemented for `chrono::DateTime<chrono::Utc>`

我无法找到导入Add的实现。 use chrono::*没有得到帮助。

我发现datetime.rsAdd<chrono::oldtime::Duration>的impl,但oldtime是私有的,因此我不知道如何创建oldtime::Duration

如何获得我需要的Add impl?如何将std::time::Duration转换为chrono::oldtime::Duration?有什么我可以导入隐式转换吗?

我正在使用rustc 1.25.0 (84203cac6 2018-03-25)

2 个答案:

答案 0 :(得分:5)

这几乎是来自chrono documentation

的引用
  

Chrono目前使用时间箱中的time::Duration类型来表示时间跨度的大小。由于此名称与较新的标准类型具有相同的持续时间,因此引用将此类型称为OldDuration。 [...]

     

Chrono尚未原生支持标准Duration类型,但将来会支持它。同时,您可以使用Duration::from_stdDuration::to_std方法在两种类型之间进行转换。

因此,必须使用OldDuration Duration添加持续时间到时间日期 - use chrono::{DateTime, Utc, Duration as OldDuration}; ,其名称为OldDuration

pub fn after(start: DateTime<Utc>) -> DateTime<Utc> {
    start + OldDuration::seconds(1)
}

然后,可以通过直接创建pub fn after(start: DateTime<Utc>) -> DateTime<Utc> { start + OldDuration::from_std(Duration::from_secs(1)).unwrap() } 来添加持续时间:

chrono

或转换标准时长。

{{1}}

在{{1}}达到1.0.0之前,可能会改善此体验。

答案 1 :(得分:5)

有一些功能可以转换fromto std::time::Duration,所以您可以这样做:

start + ::chrono::Duration::from_std(Duration::from_secs(1)).expect("1s can't overflow")

但如果你能坚持chrono,只需坚持chrono

use chrono::{DateTime, Utc, Duration};
start + Duration::seconds(1)