C#.NET中支持解析带微秒时区时间格式的DateTime.TryParseExact方法
C# DateTime.TryParseExact 解析带微秒无冒号时区格式字符串解决方案
问题根因
你使用的zzz自定义格式符默认匹配带冒号的时区偏移格式(如+00:00),而你的输入字符串时区部分为无冒号的+0000,因此无法匹配。如果未指定固定区域文化和适配的日期解析风格,也会额外提升解析失败概率。
正确配置方案
推荐重载方法
使用支持文化、解析风格配置的四参数重载即可:public static bool TryParseExact (string s, string format, IFormatProvider provider, System.Globalization.DateTimeStyles styles, out DateTime result);
参数配置规则
- 格式字符串:
- 全版本兼容(支持.NET Framework/.NET Core/.NET 5+):使用
"yyyy-MM-dd HH:mm:ss.ffffffzzzz" - .NET Core 2.1+/.NET 5+:也可直接使用
"yyyy-MM-dd HH:mm:ss.ffffffzzz"搭配DateTimeStyles.RoundtripKind兼容无冒号时区偏移
- 全版本兼容(支持.NET Framework/.NET Core/.NET 5+):使用
IFormatProvider参数:固定传入CultureInfo.InvariantCulture,避免系统默认区域设置的格式差异影响解析DateTimeStyles参数:按需选择,常用DateTimeStyles.AdjustToUniversal(解析后自动转换为UTC时间)或DateTimeStyles.None
可运行示例代码
using System; using System.Globalization; // 你的输入字符串 string dateInput = "2021-11-21 11:34:45.234567+0000"; // 全版本兼容的格式字符串 string parseFormat = "yyyy-MM-dd HH:mm:ss.ffffffzzzz"; DateTime parsedDate; bool isParseSuccess = DateTime.TryParseExact( dateInput, parseFormat, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out parsedDate ); if (isParseSuccess) { // 输出验证结果 Console.WriteLine($"解析成功,UTC时间为:{parsedDate:yyyy-MM-dd HH:mm:ss.ffffff}"); }
替代兼容方案
如果需要更灵活处理带时区偏移的日期,可先用DateTimeOffset.TryParseExact解析再转换为目标DateTime类型,兼容性更强:
DateTimeOffset offsetResult; bool isDtoParseSuccess = DateTimeOffset.TryParseExact( dateInput, parseFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out offsetResult ); // 按需取UTC时间或本地时间 DateTime utcTime = offsetResult.UtcDateTime; DateTime localTime = offsetResult.LocalDateTime;
内容的提问来源于stack exchange,提问作者ramu
相关产品推荐
相关产品推荐

