Черта `std :: ops :: Add <std :: time :: Duration>` не реализована для `chrono :: DateTime <chrono :: Utc>` - PullRequest
0 голосов
/ 02 мая 2018
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>, но oldtime является частным, поэтому я не знаю, как создать oldtime::Duration.

Как мне получить Add, который мне нужен? Как мне конвертировать std::time::Duration в chrono::oldtime::Duration? Есть ли что-то, что я могу импортировать для неявного преобразования?

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

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

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

На этот вопрос почти отвечают цитаты из 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.

...