You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用chrono解析形如2023-10-02T18:03:02.773+0000的时间戳?

用Chrono解析2023-10-02T18:03:02.773+0000的正确姿势

问题根源

  1. 用错了时间类型:你用的NaiveDateTime是专门处理无时区时间的,但输入字符串明确带了+0000时区偏移,这直接导致解析失败。
  2. 格式字符串没对齐:你尝试的格式要么没匹配毫秒位数,要么时区格式不对,要么用了完全不相关的占位符(比如%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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:50:05