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.