`chrono::DateTime<chrono::Utc>`没有实现`std::ops::Add<std::time::Duration>`特征。该内容涉及IT技术。

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

如何获得我需要的Add实现? 如何将std::time::Duration转换为chrono::oldtime::Duration? 有没有可以隐式转换的导入?

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

2个回答

6
有一些函数可以将时间间隔从 std::time::Duration 转换为 chrono 的 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)

你说得对!我不知怎么就以为没有 chrono::Duration - Victor Basso
顺便说一下,如果“Chrono目前使用time::Duration”(@E_net4的答案),我不明白它是如何出现在chrono命名空间中的。我甚至可以在std::timechrono::oldtime的源代码中找到定义的Duration(IDE会带我去那里)。但我无法直接在chrono中看到它。关于Rust模块如何工作,我肯定还有些不理解,我会再犯这个错误的。 - Victor Basso
2
@Vituel Crates 可以(并且经常会)用 pub use 重新导出东西。这里是 Duration 如何出现在 chrono 的根目录中的链接。我已经相应地更新了我的答案。 - E net4

5
这个问题几乎可以引用来自chrono 文档的一句话进行回答:

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

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

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


你太厉害了,比我快了10秒,并且回答得更好 :) - mcarton
3
@mcarton 我通常不是西部最快的枪手。但当我是时,我仍然坚持我的标准。^_^最好拿上我的牛仔帽。 - E net4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接