DateTime解析格式化异常原因及多输入格式兼容方案问询
DateTime解析与格式化问题
我有一段解析并格式化DateTime的代码:
DateTime.Parse(DateTimeValueXY, CultureInfo.InvariantCulture).ToString("dd/MM/yyyy hh:mm:ss tt")
运行时出现错误:
String was not recognized as a valid DateTime.
奇怪的是,当输入是MM/dd/yyyy格式时代码正常运行:
// 正常运行 DateTime.Parse("10/19/2022", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy hh:mm:ss tt")
但输入是目标格式dd/MM/yyyy时,反而抛出上述错误:
// 报错 -> String was not recognized as a valid DateTime DateTime.Parse("19/10/2022", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy hh:mm:ss tt")
问题
- 为何目标格式的DateTime反而触发解析错误?
- 如何处理同时存在两种输入格式的DateTime格式化需求?
解答
1. 解析错误原因
CultureInfo.InvariantCulture的默认日期解析规则是MM/dd/yyyy(月/日/年)。当你传入19/10/2022时,程序会把第一个数字19当作月份解析,但月份的有效范围是1-12,因此判定为无效日期,抛出错误。
本质是:你用了只识别「月/日/年」的文化格式,去解析「日/月/年」格式的字符串,自然解析失败。
2. 兼容两种输入格式的解决方案
放弃使用DateTime.Parse,改用DateTime.ParseExact或DateTime.TryParseExact,明确指定所有可能的输入格式,就能同时兼容两种格式:
方法一:使用ParseExact(解析失败会抛出异常)
string[] allowedFormats = { "MM/dd/yyyy", "dd/MM/yyyy" }; DateTime parsedDate = DateTime.ParseExact(inputDate, allowedFormats, CultureInfo.InvariantCulture, DateTimeStyles.None); string formattedDate = parsedDate.ToString("dd/MM/yyyy hh:mm:ss tt");
方法二:使用TryParseExact(推荐,更安全,避免异常)
string inputDate = "19/10/2022"; // 或 "10/19/2022" string[] allowedFormats = { "MM/dd/yyyy", "dd/MM/yyyy" }; if (DateTime.TryParseExact(inputDate, allowedFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime parsedDate)) { string formattedDate = parsedDate.ToString("dd/MM/yyyy hh:mm:ss tt"); // 处理格式化后的日期 } else { // 处理解析失败的场景 }
这种方式明确告知程序需要识别的格式,不管输入是「月/日/年」还是「日/月/年」,都能正确解析后转换成目标格式。
内容的提问来源于stack exchange,提问作者Paul Richardson
相关产品推荐
相关产品推荐

