5
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.rs有一个 impl Add<chrono::oldtime::Duration>,但是oldtime是私有的,所以我不知道如何创建一个oldtime::Duration.

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

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

4

2 回答 2

6

有一些函数可以相互转换所以你可以这样做: 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)
于 2018-05-01T22:00:28.190 回答
5

这几乎可以用chrono 文档中的引用来回答:

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

Chrono 本身还不支持标准Duration类型,但将来会支持。Duration::from_std同时,您可以使用和Duration::to_std方法在两种类型之间进行转换。

因此,必须使用 this 向 Chrono 日期时间添加持续时间OldDuration,它实际上是从名为的 crate 的根目录中导出的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.0.0之前,这种体验可能会得到改善。

于 2018-05-01T22:00:17.750 回答