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

如何在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(&timestr, "%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,它对本地化解析的支持更完善:

  1. 添加依赖:
cargo add time --features macros,localization
  1. 测试代码:
#[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:47:42