Rust Chrono库解析时间报错ParseError(NotEnough)求助
解决DateTime解析时的ParseError(NotEnough)问题
你遇到的ParseError(NotEnough)问题,核心原因是你使用的DateTime::parse_from_str方法期望解析包含时区信息的日期时间字符串,但你的输入09-January-2018 12:00:00里并没有时区部分,解析器找不到它需要的时区数据,所以抛出了"缺少必要信息"的错误。
解决方案分两种情况:
1. 你不需要处理时区(仅需本地日期时间)
改用NaiveDateTime的parse_from_str方法,它专门用于解析不带时区的日期时间字符串:
use chrono::NaiveDateTime; let date_str = "09-January-2018 12:00:00"; let date = NaiveDateTime::parse_from_str(date_str.trim(), "%d-%B-%Y %T"); // 验证结果 match date { Ok(dt) => println!("解析成功:{}", dt), Err(e) => println!("解析失败:{}", e), }
2. 你需要时区信息
如果业务逻辑要求带时区,有两种处理方式:
- 修改输入字符串:在末尾添加时区标识,比如
09-January-2018 12:00:00 +08:00,然后保持原方法,格式串加上%z:use chrono::DateTime; let date_str = "09-January-2018 12:00:00 +08:00"; let date = DateTime::parse_from_str(date_str.trim(), "%d-%B-%Y %T %z"); - 手动指定默认时区:先解析为
NaiveDateTime,再转换为带时区的DateTime:use chrono::{NaiveDateTime, DateTime, FixedOffset}; let date_str = "09-January-2018 12:00:00"; let naive_dt = NaiveDateTime::parse_from_str(date_str.trim(), "%d-%B-%Y %T").unwrap(); // 这里以东八区为例,你可以根据需求调整时区偏移 let dt_with_timezone: DateTime<FixedOffset> = naive_dt.and_local_timezone(FixedOffset::east_opt(8 * 3600).unwrap()).unwrap();
额外提醒:确保你的chrono库版本是最新的,避免旧版本的解析bug;同时%B对应的月份名称是本地化的,你的输入是英文January,只要运行环境默认语言是英文就不会有问题,如果不是,可能需要手动指定解析器的locale。
内容的提问来源于stack exchange,提问作者Catman155
相关产品推荐
相关产品推荐

