Rust chrono库DateTime<FixedOffset>与DateTime<Tz>转换方法
Rust chrono库
DateTime<FixedOffset>与DateTime<Tz>互转方法 问题复现
尝试直接给DateTime<FixedOffset>类型变量赋值DateTime<Tz>类型值时,会触发类型不匹配编译错误:
use chrono::DateTime; use chrono_tz::America::New_York; fn main() { let mut a = DateTime::parse_from_rfc3339("2022-06-01T10:00:00Z").unwrap(); let b = a.with_timezone(&New_York); a = b; }
编译报错信息:
error[E0308]: mismatched types --> src/main.rs:13:9 | 11 | let mut a = DateTime::parse_from_rfc3339("2022-06-01T10:00:00Z").unwrap(); | ------------------------------------------------------------ expected due to this value 12 | let b = a.with_timezone(&New_York); 13 | a = b; | ^ expected struct `FixedOffset`, found enum `Tz` | = note: expected struct `DateTime<FixedOffset>` found struct `DateTime<Tz>`
报错核心原因是DateTime是泛型结构体,时区参数不同就属于完全不同的类型,Rust不会做隐式类型转换。
不同场景的处理方式
- 时长差计算、大小/等值比较场景:不需要做类型转换。chrono已经为所有实现
TimeZonetrait的时区类型实现了跨类型的时间运算、比较逻辑,底层统一基于UTC时间戳计算,直接调用即可:// 以下代码可直接编译运行 let time_gap = b - a; let is_equal = a == b; let is_later = b > a; - 变量赋值、同类型参数传递场景:需要显式做类型转换,根据目标类型选择对应方法:
- 转成
DateTime<FixedOffset>:对DateTime<Tz>值调用.fixed_offset()方法,会提取当前时间点对应时区的固定UTC偏移,生成匹配类型的值 - 转成
DateTime<Tz>:对DateTime<FixedOffset>值调用.with_timezone(&目标时区)方法即可
- 转成
修正后可运行代码
use chrono::DateTime; use chrono_tz::America::New_York; fn main() { let mut a = DateTime::parse_from_rfc3339("2022-06-01T10:00:00Z").unwrap(); let b = a.with_timezone(&New_York); // 显式转换为FixedOffset类型后即可赋值 a = b.fixed_offset(); // 验证运算、比较逻辑正常 let diff = b - a; assert_eq!(a, b); println!("二者时间差为: {:?}", diff); }
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

