.NET中如何编写兼容DateTime.UtcNow所有毫秒精度的日期格式?
.NET中如何编写兼容DateTime.UtcNow所有毫秒精度的日期格式?
嗨,我明白你的困扰了——DateTime.UtcNow输出的毫秒部分长度忽长忽短,用固定位数的格式串去Parse总是会有漏网之鱼对吧?别着急,这里有几个靠谱的解决方案:
方案一:传入多格式字符串数组
既然不同场景下毫秒部分的位数不一样,那我们可以给TryParseExact提供一组格式字符串,让它依次尝试匹配,只要有一个格式符合就会解析成功。比如我们可以覆盖从1位到7位的毫秒精度:
var supportedFormats = new[] { "yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'", // 7位毫秒 "yyyy-MM-dd'T'HH:mm:ss.ffffff'Z'", // 6位毫秒 "yyyy-MM-dd'T'HH:mm:ss.fffff'Z'", // 5位毫秒 "yyyy-MM-dd'T'HH:mm:ss.ffff'Z'", // 4位毫秒 "yyyy-MM-dd'T'HH:mm:ss.fff'Z'", // 3位毫秒 "yyyy-MM-dd'T'HH:mm:ss.ff'Z'", // 2位毫秒 "yyyy-MM-dd'T'HH:mm:ss.f'Z'", // 1位毫秒 "yyyy-MM-dd'T'HH:mm:ss'Z'" // 无毫秒 }; if (DateTime.TryParseExact( "2025-02-27T06:01:59.7581509Z", supportedFormats, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out DateTime utcParsedValue)) { var test = utcParsedValue; }
这种方式的好处是你可以完全掌控需要支持的精度范围,灵活性很高。
方案二:使用Round-trip格式符(推荐)
如果你使用的是.NET Core 2.0+、.NET 5+或者更新的框架,直接用"o"(或者"O")格式符就可以搞定——这是专门为DateTime的“往返”场景设计的格式,它天生支持可变长度的毫秒部分,因为它的规范就是保留所有有效精度数字,不会强制固定位数。
代码示例:
if (DateTime.TryParseExact( "2025-02-27T06:01:59.7581509Z", "o", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out DateTime utcParsedValue)) { var test = utcParsedValue; }
这个方法最省心,因为DateTime.UtcNow输出的字符串本身就符合Round-trip格式的规范,用它解析完全不用担心精度不匹配的问题。
为什么原来的固定格式会失败?
之所以你之前写的"yyyy-MM-dd'T'HH:mm:ss.ffffff'Z'"只能解析6位毫秒,是因为ffffff是严格匹配6位数字,多一位或者少一位都会判定为格式不匹配;同理,fffffff只会匹配7位毫秒,少一位也会失败。而上面的两种方法,要么覆盖了所有可能的位数,要么利用了框架内置的可变精度格式,自然就能解决你的问题啦。
备注:内容来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

