如何解析「二 5月 16 14:41:40 +0800 2023」为DateTimeOffset?
解决中文单字星期的DateTimeOffset解析问题
问题核心在于:zh-CN文化下的默认星期缩写是「周一、周二...周日」,而你的字符串中是单字形式的「二」,导致默认解析逻辑无法识别。以下是两种可行的解决方法:
方法一:替换单字星期为标准缩写
先将字符串中的单字星期替换为zh-CN文化认可的标准缩写,再使用常规解析方法:
string lastLogin = "二 5月 16 14:41:40 +0800 2023"; // 建立单字星期到标准缩写的映射 var weekMapping = new Dictionary<string, string> { {"日", "周日"}, {"一", "周一"}, {"二", "周二"}, {"三", "周三"}, {"四", "周四"}, {"五", "周五"}, {"六", "周六"} }; // 替换字符串开头的单字星期 foreach (var pair in weekMapping) { if (lastLogin.StartsWith(pair.Key)) { lastLogin = lastLogin.Replace(pair.Key, pair.Value); break; } } // 执行解析 DateTimeOffset result = DateTimeOffset.Parse(lastLogin, new CultureInfo("zh-CN"), DateTimeStyles.None);
方法二:自定义DateTimeFormatInfo支持单字星期
直接修改文化信息中的星期缩写规则,让解析逻辑识别单字形式:
string lastLogin = "二 5月 16 14:41:40 +0800 2023"; // 基于zh-CN创建自定义文化信息 var customCulture = new CultureInfo("zh-CN"); // 将星期缩写替换为单字数组 customCulture.DateTimeFormat.AbbreviatedDayNames = new[] {"日", "一", "二", "三", "四", "五", "六"}; // 使用自定义文化和对应格式字符串解析 DateTimeOffset result = DateTimeOffset.ParseExact( lastLogin, "ddd MMM d HH:mm:ss zzz yyyy", customCulture, DateTimeStyles.None );
补充说明
- 格式字符串中的
ddd对应星期缩写,修改后的AbbreviatedDayNames会让ddd匹配单字星期; MMM对应中文月份缩写「5月」,zh-CN文化默认支持该格式,无需额外修改。
内容的提问来源于stack exchange,提问作者Bart
相关产品推荐
相关产品推荐

