DateTime转义\在.NET Framework生效,.NET 6.0失败求解决方法
.NET 6中DateTime.ParseExact解析KST时间字符串失败的解决办法
问题现象
以下代码在mono-6.12.0或.NET Framework 4.7.2中可正常运行,但在.NET 6.0中执行失败,抛出System.FormatException:
未处理的异常。System.FormatException: 字符串'Sat Sep 10 05:57:59 KST 2022'未被识别为有效的DateTime。
在System.DateTime.ParseExact(String s, String format, IFormatProvider provider)处。
原代码:
var data = "Sat Sep 10 05:57:59 KST 2022"; var time = DateTime.ParseExact(data, "ddd MMM d hh:mm:ss \\K\\S\\T yyyy", null); Console.WriteLine(time);
问题原因
- 区域性不匹配:原代码传入
null作为IFormatProvider,会使用当前系统的区域性设置。.NET 6对解析规则更严格,如果当前系统区域不是英文,无法识别字符串中的英文星期缩写(Sat)和月份缩写(Sep)。 - 时区处理缺失:直接转义
KST仅能匹配字符串格式,但没有将其作为时区信息解析,丢失了时间的时区上下文。
解决方案
方案1:指定英文区域性并补充时区处理
通过指定CultureInfo.InvariantCulture确保解析英文缩写,同时可以结合TimeZoneInfo处理KST时区:
using System.Globalization; using System; var data = "Sat Sep 10 05:57:59 KST 2022"; // 使用InvariantCulture匹配英文星期和月份缩写 var parsedTime = DateTime.ParseExact(data, "ddd MMM d hh:mm:ss \\K\\S\\T yyyy", CultureInfo.InvariantCulture); // 解析为带KST时区的DateTimeOffset(可选,用于保留时区信息) var kstTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Korea Standard Time"); var dateTimeOffset = new DateTimeOffset(parsedTime, kstTimeZone.GetUtcOffset(parsedTime)); Console.WriteLine("本地时间:" + parsedTime); Console.WriteLine("UTC时间:" + dateTimeOffset.UtcDateTime);
方案2:替换时区标识为偏移量,使用DateTimeOffset解析(更推荐)
将KST替换为对应的UTC偏移量+09:00,然后用DateTimeOffset.ParseExact解析,直接保留时区信息:
using System.Globalization; using System; var data = "Sat Sep 10 05:57:59 KST 2022"; // 替换KST为UTC+9的偏移量格式 var adjustedData = data.Replace("KST", "+09:00"); // 使用包含时区偏移的格式字符串解析 var dateTimeOffset = DateTimeOffset.ParseExact(adjustedData, "ddd MMM d hh:mm:ss zzz yyyy", CultureInfo.InvariantCulture); Console.WriteLine("带时区的时间:" + dateTimeOffset); Console.WriteLine("转换为本地时间:" + dateTimeOffset.LocalDateTime);
说明
旧版.NET Framework和Mono对区域性解析的兼容性更宽松,即使当前区域非英文也可能匹配英文缩写;而.NET 6严格遵循区域性规则,必须显式指定支持英文缩写的区域性(如InvariantCulture)才能正确解析。
内容的提问来源于stack exchange,提问作者Damn Vegetables
相关产品推荐
相关产品推荐

