You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:43:00