为何chrono::DateTime<Utc>无法与std::time::Duration执行加法操作?
嘿,我刚碰到过类似的问题,其实这个错误的原因很明确——chrono的DateTime<Utc>并没有实现和标准库std::time::Duration相加的Add trait,它只认自己库里面的chrono::Duration类型。
先看一下你遇到问题的代码和错误信息:
你的代码:
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]: 无法将
std::time::Duration与chrono::DateTime<chrono::Utc>相加
--> src/lib.rs:7:11
|
7 | start + Duration::from_secs(1_000_000_000)
| ^ 未实现chrono::DateTime<chrono::Utc> + std::time::Duration的相关操作
| = help: 特征std::ops::Add<std::time::Duration>未为chrono::DateTime<chrono::Utc>实现。
接下来给你几个简单的解决办法:
方法一:直接使用chrono自带的Duration
这是最直接的方式,把导入的std::time::Duration换成chrono::Duration就行,chrono的Duration提供了更贴合时间操作的构造方法:
extern crate chrono; use chrono::{DateTime, Utc, Duration}; // 导入chrono的Duration pub fn after(start: DateTime<Utc>) -> DateTime<Utc> { start + Duration::seconds(1) // 用chrono的方法构造1秒的时长 }
方法二:把标准库Duration转换成chrono的Duration
如果你因为业务需求必须用标准库的Duration,可以用chrono::Duration的from_std方法做转换,不过这个方法会返回Result,因为标准库的Duration取值范围比chrono的大,转换可能失败,实际项目里建议处理错误,而不是直接unwrap:
extern crate chrono; use chrono::{DateTime, Utc, Duration}; use std::time::Duration as StdDuration; // 给标准库Duration起个别名区分 pub fn after(start: DateTime<Utc>) -> DateTime<Utc> { // 转换时长,这里简单unwrap演示,实际要处理Err情况 let chrono_duration = Duration::from_std(StdDuration::from_secs(1)).unwrap(); start + chrono_duration }
额外推荐:更安全的加法方式
如果你担心时间溢出的问题,可以用DateTime的checked_add_signed方法,它会返回Option<DateTime<Utc>>,当加法导致溢出时会返回None,比直接用+更安全:
extern crate chrono; use chrono::{DateTime, Utc, Duration}; pub fn after(start: DateTime<Utc>) -> Option<DateTime<Utc>> { start.checked_add_signed(Duration::seconds(1)) }
内容的提问来源于stack exchange,提问作者Victor Basso

