如何让Rust的chrono_tz同时解析固定偏移与Area/Location时区?
同时解析固定偏移时区与Area/Location格式时区?
以下是原始代码:
use chrono_tz::Tz; fn parse_ts(ts: &str) -> Tz { ts.parse().unwrap() } fn main() { let ts: &str = "UTC"; println!("parsed: {:?}", parse_ts(ts)); }
这段代码处理"UTC"这类Area/Location格式的时区时运行正常,但将输入替换为"+00:00"这类固定偏移格式时会触发 panic,报错信息如下:
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: "'+00:00' is not a valid timezone"', src/main.rs:4:16
可以改写parse_ts函数实现两种格式的兼容处理,思路是先尝试解析为chrono_tz::Tz,失败后再尝试解析为固定偏移的FixedOffset,最后将FixedOffset转换为Tz:
use chrono::{FixedOffset, TimeZone}; use chrono_tz::Tz; fn parse_ts(ts: &str) -> Tz { // 优先解析Area/Location格式时区 ts.parse::<Tz>() .or_else(|_| { // 解析失败则尝试固定偏移格式,再转换为Tz ts.parse::<FixedOffset>() .map(|offset| offset.into()) }) .unwrap() // 实际项目中建议替换为错误处理逻辑,避免panic } fn main() { println!("parsed UTC: {:?}", parse_ts("UTC")); println!("parsed +00:00: {:?}", parse_ts("+00:00")); println!("parsed Asia/Shanghai: {:?}", parse_ts("Asia/Shanghai")); println!("parsed +08:00: {:?}", parse_ts("+08:00")); }
补充说明
chrono_tz::Tz实现了From<FixedOffset>trait,因此可以直接将固定偏移对象转换为Tz类型- 生产环境中不要直接使用
unwrap(),建议返回Result<Tz, Box<dyn std::error::Error>>,通过match或?来处理解析失败的情况,保证程序稳定性
内容的提问来源于stack exchange,提问作者ignoring_gravity
相关产品推荐
相关产品推荐

