日语环境下DateTime.ParseExact抛出System.FormatException问题求助
DateTime格式化/解析抛出System.FormatException的原因分析
核心原因
- 写入
DateTime字符串时未指定文化,默认使用系统当前区域设置(日语环境),导致自定义格式中的分隔符被替换:- 自定义格式字符串
"yyyy-MM-dd HH-mm-ss"里的-属于非转义的分隔符占位符,会被当前文化的DateSeparator(日语环境为/)和TimeSeparator(日语环境为:)替换,最终写入的字符串实际格式为yyyy/MM/dd HH:mm:ss。
- 自定义格式字符串
- 解析时使用
CultureInfo.InvariantCulture,该文化的日期分隔符是-、时间分隔符是:,解析器期望字符串格式为yyyy-MM-dd HH-mm-ss,但实际读取到的字符串格式不匹配,因此抛出System.FormatException。
验证依据
你提到传入日语文化到date.ToString(..)后一切正常,是因为此时若解析也使用日语文化(保持文化一致),解析时格式里的-同样会被替换为日语文化的分隔符,字符串与解析规则匹配,因此不会报错。
解决方案
有两种可行的解决方式:
- 统一使用固定文化:写入和解析都用
CultureInfo.InvariantCulture,彻底避免区域设置的影响:// 写入时指定InvariantCulture test.AccessDateTime = DateTime.Now.ToString(format, CultureInfo.InvariantCulture); // 解析时保持一致(你已实现此部分) d = DateTime.ParseExact(test.AccessDateTime, format, CultureInfo.InvariantCulture); - 转义格式中的分隔符:将自定义格式里的
-用单引号括起来,强制作为普通字符输出,不被文化分隔符替换:string format = "yyyy'-'MM'-'dd HH'-'mm'-'ss"; // 写入时无需指定文化,解析时使用同一格式即可
内容的提问来源于stack exchange,提问作者Yosif Chumpov
相关产品推荐
相关产品推荐

