如何在Rust中解析非英文Locale的DateTime?
解决Rust中chrono解析德语本地化DateTime的问题
问题根源
chrono的unstable-locales特性目前仅支持本地化格式化输出,不支持反向解析本地化的日期组件(比如德语月份缩写Mai)。你尝试的StrftimeItems::new_with_locale只是用于生成格式化模板,解析逻辑并不会根据locale匹配本地化的月份/星期缩写,所以直接用%b解析德语月份会失败。
解决方案
方案1:手动替换本地化月份缩写(轻量无额外依赖)
直接将德语月份缩写替换为对应的英文缩写,再用chrono原生的解析方法处理:
#[cfg(test)] mod tests { use chrono::prelude::*; #[test] fn test_parse_en() { let timestr = "10-May-23 10:15"; let dt = NaiveDateTime::parse_from_str(×tr, "%d-%b-%y %H:%M"); println!("en: dt={:?}", dt); assert!(dt.is_ok()); } #[test] fn test_parse_de() { let timestr = "10-Mai-23 10:15"; // 德语月份缩写到英文的映射表,包含变音符号的缩写 let de_en_month_map = [ ("Jan", "Jan"), ("Feb", "Feb"), ("Mär", "Mar"), ("Apr", "Apr"), ("Mai", "May"), ("Jun", "Jun"), ("Jul", "Jul"), ("Aug", "Aug"), ("Sep", "Sep"), ("Okt", "Oct"), ("Nov", "Nov"), ("Dez", "Dec"), ]; // 替换字符串中的德语月份 let mut processed_str = timestr.to_string(); for (de_abbr, en_abbr) in de_en_month_map { processed_str = processed_str.replace(de_abbr, en_abbr); } let dt = NaiveDateTime::parse_from_str(&processed_str, "%d-%b-%y %H:%M"); println!("de: dt={:?}", dt); assert!(dt.is_ok()); } }
方案2:使用time crate(原生支持本地化解析)
如果需要长期处理多语言日期解析,推荐使用time crate,它对本地化解析的支持更完善:
- 添加依赖:
cargo add time --features macros,localization
- 测试代码:
#[cfg(test)] mod tests { use time::{format_description::FormatItem, macros::format_description, OffsetDateTime}; #[test] fn test_parse_de_with_time_crate() { let timestr = "10-Mai-23 10:15"; // 定义匹配格式 let format = format_description!("[day]-[month abbreviation]-[year repr:two_digit] [hour]:[minute]"); // 使用德语Locale解析 let dt = OffsetDateTime::parse(timestr, &format, &time::Utc, &time::locale::de_DE) .expect("Failed to parse German datetime"); println!("de with time: dt={:?}", dt); assert_eq!(dt.year(), 2023); assert_eq!(dt.month(), time::Month::May); assert_eq!(dt.day(), 10); assert_eq!(dt.hour(), 10); assert_eq!(dt.minute(), 15); } }
为什么原代码的test_parse_de_localized失败
chrono的parse函数并未对接locale的解析逻辑,StrftimeItems::new_with_locale仅用于生成格式化输出的模板,解析时依然会使用英文的月份缩写规则匹配,因此无法识别Mai这类德语缩写。
内容的提问来源于stack exchange,提问作者2r2w
相关产品推荐
相关产品推荐

