ASP.NET Core:解决System.FormatException日期格式转换错误
解决ASP.NET Core中DateTime.ParseExact格式异常问题
问题根源
你使用的解析格式"yyyy/MM/dd"和输入字符串的格式完全不匹配:
- 原始输入是ISO 8601格式:
"2019-08-24T14:15:22Z"(包含横杠日期分隔符、T时间分隔符、完整时间部分和时区标识Z) - 错误信息中显示的另一种输入格式:
"2023-04-09 10:59"(横杠日期分隔符、空格时间分隔符、小时分钟部分)
这两种格式都和你指定的yyyy/MM/dd(斜杠分隔符、仅日期部分)不匹配,因此抛出System.FormatException。
解决方案
1. 解析ISO 8601格式字符串
如果输入始终是"yyyy-MM-ddTHH:mm:ssZ"格式,使用对应格式字符串解析后再转换为目标格式:
using System.Globalization; // 解析ISO格式的字符串 DateTime expiryDate = DateTime.ParseExact( initializationResponse.expiry_date, "yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture ); // 转换为"yyyy-MM-dd HH:mm"格式的字符串 string formattedDate = expiryDate.ToString("yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture);
2. 支持多种输入格式
如果输入可能是"yyyy-MM-ddTHH:mm:ssZ"或"yyyy-MM-dd HH:mm"两种格式,使用多格式数组解析:
using System.Globalization; string[] inputFormats = { "yyyy-MM-ddTHH:mm:ssZ", "yyyy-MM-dd HH:mm" }; DateTime expiryDate = DateTime.ParseExact( initializationResponse.expiry_date, inputFormats, CultureInfo.InvariantCulture, DateTimeStyles.None ); string formattedDate = expiryDate.ToString("yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture);
3. 安全解析(避免异常)
使用DateTime.TryParseExact替代ParseExact,可以在解析失败时优雅处理:
using System.Globalization; if (DateTime.TryParseExact( initializationResponse.expiry_date, "yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime expiryDate )) { string formattedDate = expiryDate.ToString("yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture); // 执行后续逻辑 } else { // 处理解析失败的情况,比如提示用户输入无效 }
关键注意事项
ParseExact要求输入字符串和格式字符串完全匹配,包括分隔符(横杠/斜杠/空格/T)、时间部分长度、时区标识等。- 使用
CultureInfo.InvariantCulture避免因系统区域设置导致的格式解析差异。
内容的提问来源于stack exchange,提问作者Bami
相关产品推荐
相关产品推荐

