使用DateTime.ParseExact转换日期遇System.ArgumentNullException,求排查
问题分析与解决方法
嘿,这个问题我熟!你踩了ParseExact最常见的坑——把输入格式和输出格式搞混啦😅
错误根源
你写的代码里,ParseExact的第二个参数是"dddd MMMM yyyy",这个格式代表的是「星期全称 + 月份全称 + 年份」(比如意大利语的lunedì gennaio 2018),但你要解析的输入字符串却是"2018/01/01"(数字格式的年/月/日)。两者完全不匹配,程序根本无法识别这个字符串是有效的日期,所以抛出了异常。
ParseExact的核心逻辑是:用第二个参数定义的格式,去匹配第一个参数的输入字符串,而不是用来指定最终输出的格式。你想用它避免错误的思路是对的,但参数的作用搞反了。
修正后的代码
根据你的需求(把2018/01/01转换成当前系统语言的日期格式),正确的步骤应该是:
- 先用
ParseExact按照输入字符串的格式(yyyy/MM/dd)解析出DateTime对象; - 再用
ToString结合系统当前文化,转换成你想要的本地化格式。
示例代码:
// 第一步:正确解析输入的数字格式日期 DateTime parsedDate = DateTime.ParseExact("2018/01/01", "yyyy/MM/dd", System.Globalization.CultureInfo.InvariantCulture); // 第二步:转换成当前系统语言的日期格式 string systemFormattedDate = parsedDate.ToString(System.Globalization.CultureInfo.CurrentCulture);
额外说明
- 用
InvariantCulture解析是因为输入的是纯数字日期,不依赖特定地区的格式规则,解析更稳定; - 如果你本来想解析意大利语的文本格式日期(比如
"lunedì gennaio 2018"),那才需要用"dddd MMMM yyyy"作为格式参数,搭配it-IT文化:DateTime italianDate = DateTime.ParseExact("lunedì gennaio 2018", "dddd MMMM yyyy", new System.Globalization.CultureInfo("it-IT")); string systemFormattedDate = italianDate.ToString(System.Globalization.CultureInfo.CurrentCulture);
内容的提问来源于stack exchange,提问作者MrFantastic
相关产品推荐
相关产品推荐

