使用TryParseExact转换带时区的DateTime字符串失败求助
问题
我有一个带时区的字符串"2023-04-13T07:03:20-03:00",希望通过TryParseExact方法按指定格式"yyyy-MM-ddTHH:mm:ss"转换为DateTime类型,但返回结果始终为false。不带时区的字符串可正常转换,我尝试设置DateTimeStyles.AssumeUniversal也无效,附上相关代码及运行结果:
using System; using System.Linq; using System.Collections.Generic; using System.Globalization; public class Program { public static void Main() { var formats = new[]{ "o", "s", "t", "T", "M/yy", "dd-MM-yy", "yyyy-MM-ddTHH:mm:ss",}; foreach(var format in formats) { DateTime dat1; DateTime dat2; Console.WriteLine(format); Console.WriteLine(""); Console.WriteLine(DateTime.TryParseExact("2023-04-13T07:03:20-03:00", formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dat1) ? dat1.ToString(format) : "false"); Console.WriteLine(DateTime.TryParseExact("2023-04-13T07:03:20", formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dat2) ? dat2.ToString(format) : "false"); Console.WriteLine(""); Console.WriteLine("--------------------"); } } }
运行结果:
o false 2023-04-13T07:03:20.0000000 -------------------- s false 2023-04-13T07:03:20 -------------------- t false 7:03 AM -------------------- T false 7:03:20 AM -------------------- M/yy false 4/23 -------------------- dd-MM-yy false 13-04-23 -------------------- yyyy-MM-ddTHH:mm:ss false 2023-04-13T07:03:20 --------------------
解决方案
核心原因
TryParseExact是严格匹配格式的方法:你的目标字符串带时区偏移-03:00,但提供的格式字符串yyyy-MM-ddTHH:mm:ss完全不包含时区相关的格式符,所以无法匹配,返回false是预期行为。DateTimeStyles.AssumeUniversal只是指定解析后的时区归属,不能忽略字符串中实际存在的时区部分。
两种可行解决办法
- 添加支持时区的格式字符串
在格式数组里加入带时区的格式"yyyy-MM-ddTHH:mm:sszzz",这样就能匹配带时区偏移的字符串:
var formats = new[]{ "o", "s", "t", "T", "M/yy", "dd-MM-yy", "yyyy-MM-ddTHH:mm:ss", "yyyy-MM-ddTHH:mm:sszzz" // 新增带时区格式 };
解析后会自动处理时区偏移,转换后的DateTime对象的Kind属性会根据DateTimeStyles设置调整(默认转为本地时间)。
- 先截断时区部分再解析
如果不需要时区信息,可以直接截取字符串前19位(去掉末尾的-03:00),再用原格式解析:
string originalStr = "2023-04-13T07:03:20-03:00"; string trimmedStr = originalStr.Substring(0, 19); DateTime.TryParseExact(trimmedStr, "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result);
额外建议
如果需要保留时区信息,更推荐使用DateTimeOffset类型,它原生支持时区偏移,解析逻辑更清晰:
DateTimeOffset.TryParseExact("2023-04-13T07:03:20-03:00", "yyyy-MM-ddTHH:mm:sszzz", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTimeOffset dto);
内容的提问来源于stack exchange,提问作者Calendoscopio
相关产品推荐
相关产品推荐

