如何使用chrono解析形如2023-10-02T18:03:02.773+0000的时间戳?
用Chrono解析
2023-10-02T18:03:02.773+0000的正确姿势 问题根源
- 用错了时间类型:你用的
NaiveDateTime是专门处理无时区时间的,但输入字符串明确带了+0000时区偏移,这直接导致解析失败。 - 格式字符串没对齐:你尝试的格式要么没匹配毫秒位数,要么时区格式不对,要么用了完全不相关的占位符(比如
%x是本地日期格式,根本不是时间)。
直接能用的解决方案
第一步:换对时间类型
别用NaiveDateTime,改用支持时区的DateTime<Utc>或者DateTime<FixedOffset>。
第二步:用正确的格式字符串
针对你的时间格式,精准匹配的格式字符串是:
%Y-%m-%dT%H:%M:%S%.3f%z
拆解一下:
%Y-%m-%d:对应年-月-日部分T:直接匹配字符串里的'T'字符(注意是大写,和输入一致)%H:%M:%S:对应时:分:秒%.3f:匹配3位毫秒(你的输入是.773,正好3位,%.3f会自动截断或补零到3位)%z:匹配时区偏移(比如+0000)
完整可运行代码
use chrono::{DateTime, Utc}; fn main() { let time = "2023-10-02T09:31:02.773+0000"; // 解析成UTC时区的DateTime let date = DateTime::<Utc>::parse_from_str(time, "%Y-%m-%dT%H:%M:%S%.3f%z").unwrap(); println!("解析结果:{}", date); }
如果确实需要无时区的NaiveDateTime
要是你必须得到NaiveDateTime,可以先解析带时区的时间,再转成无时区的版本:
use chrono::{DateTime, Utc, NaiveDateTime}; fn main() { let time = "2023-10-02T09:31:02.773+0000"; let tz_date = DateTime::<Utc>::parse_from_str(time, "%Y-%m-%dT%H:%M:%S%.3f%z").unwrap(); let naive_date = tz_date.naive_utc(); // 转成UTC基准的无时区时间 println!("无时区时间:{}", naive_date); }
为啥之前的尝试都失败?
%x是本地日期占位符,比如10/02/23,和你的时间部分完全不搭rfc3389要求时区是+00:00(带冒号),但你的输入是+0000(无冒号),格式不兼容%f默认是6位微秒,你的输入只有3位毫秒,必须用%.3f指定位数才能匹配NaiveDateTime根本不支持时区输入,直接触发Impossible错误
内容的提问来源于stack exchange,提问作者ar rr
相关产品推荐
相关产品推荐

