The trait `std::ops::Add<std::time::Duration>` is not implemented for `chrono::DateTime<chrono::Utc>`

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>`

I couldn't find an implementation of Add to import. use chrono::* не поможет

я вижу это datetime.rs has an impl for Add<chrono::oldtime::Duration>, но oldtime is private so I don't know how to create an oldtime::Duration,

Как я могу получить Add impl I need? Как мне конвертировать std::time::Duration в chrono::oldtime::Duration? Is there something I can import to convert implicitly?

я использую rustc 1.25.0 (84203cac6 2018-03-25)

2 ответа

Решение

Есть функции для преобразования из и в 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)

Это почти ответил цитатой из chrono документация:

Chrono в настоящее время использует time::Duration введите из ящика времени, чтобы представить величину промежутка времени. Так как он имеет то же имя для нового, стандартного типа для продолжительности, ссылка будет ссылаться на этот тип как OldDuration, [...]

Chrono пока не поддерживает стандарт Duration типа, но это будет поддерживаться в будущем. Между тем вы можете конвертировать между двумя типами с Duration::from_std а также Duration::to_std методы.

Таким образом, добавление длительности к дате-времени Chrono должно быть сделано с этим 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.0.0.

Другие вопросы по тегам