使用Chrono的NaiveDate时,如何编程判断是否完整消耗格式字符串?
如何判断Chrono是否完整消耗了整个格式字符串
你的场景中,NaiveDate::parse_from_str会只提取日期部分,自动忽略格式串中超出NaiveDate所需的规则,且不会因此报错。要判断是否完整消耗了输入字符串的所有内容,可以用以下两种方法实现:
方法一:用底层parse函数获取解析进度
chrono提供了底层的parse函数,它会返回解析结果和已解析的输入字符长度。通过对比已解析长度和输入字符串的总长度,就能判断是否完整消耗了输入:
use chrono::{NaiveDate, format::{parse, StrftimeItems}}; fn main() { let input = "1978-01-12 01:00:23"; let format = "%Y-%m-%d %H:%M:%S"; let parse_result = parse::<NaiveDate, _>(input, StrftimeItems::new(format)); match parse_result { Ok((date, parsed_len)) => { if parsed_len == input.len() { println!("完整解析了输入字符串,日期:{}", date); } else { println!("仅解析了前{}个字符,剩余未解析部分:{}", parsed_len, &input[parsed_len..]); } } Err(e) => println!("解析错误:{}", e), } }
运行这段代码会输出仅解析了前10个字符,剩余未解析部分: 01:00:23,因为NaiveDate只匹配到日期部分就停止了解析。
方法二:先解析为NaiveDateTime再提取日期
如果你的格式串包含完整的日期时间规则,先解析成NaiveDateTime可以强制验证输入完全符合格式,之后再提取日期部分:
use chrono::NaiveDateTime; fn main() { let input = "1978-01-12 01:00:23"; let format = "%Y-%m-%d %H:%M:%S"; match NaiveDateTime::parse_from_str(input, format) { Ok(datetime) => { let date = datetime.date(); println!("完整解析输入,日期:{}", date); } Err(e) => println!("解析错误:{}", e), } }
这种方法下,如果输入字符串存在多余内容(比如末尾额外添加字符),解析会直接报错,以此确保输入被完整消耗。
补充说明
NaiveDate::parse_from_str的设计逻辑就是只提取日期相关的格式规则,即使格式串包含时间部分,它也会忽略这些规则,仅解析到日期匹配完成。- 若需要严格验证输入完全符合格式串的所有规则,优先使用方法二,或用方法一的长度对比逻辑做判断。
内容的提问来源于stack exchange,提问作者ignoring_gravity
相关产品推荐
相关产品推荐

