DateTime.UtcNow 值是如何计算的?

Kim*_*imi 1 .net c# windows time timer

.Net 到底从哪里获取这个值?这是GetSystemTimeAsFileTime的值吗?那么这个值是如何计算的呢?它是否以某种方式基于QPC值?

Sri*_*vel 5

UtcNow定义如下。(为简洁起见,删除了属性)

public static DateTime UtcNow
{
    get
    {
        return new DateTime((ulong) ((GetSystemTimeAsFileTime() + 0x701ce1722770000L) | 0x4000000000000000L));
    }
}
Run Code Online (Sandbox Code Playgroud)

GetSystemTimeAsFileTime被定义为内部调用。

[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
internal static extern long GetSystemTimeAsFileTime();
Run Code Online (Sandbox Code Playgroud)

Reflector 已经无能为力了,让我们深入研究sscli

GetSystemTimeAsFileTime映射到SystemNative::__GetSystemTimeAsFileTime(ecall.cpp)

FCFuncStart(gDateTimeFuncs)
    FCFuncElement("GetSystemTimeAsFileTime", SystemNative::__GetSystemTimeAsFileTime)
FCFuncEnd()
Run Code Online (Sandbox Code Playgroud)

最后SystemNative::__GetSystemTimeAsFileTime实现如下(comsystem.cpp)

FCIMPL0(INT64, SystemNative::__GetSystemTimeAsFileTime)
{
    WRAPPER_CONTRACT;
    STATIC_CONTRACT_SO_TOLERANT;

    INT64 timestamp;

    ::GetSystemTimeAsFileTime((FILETIME*)&timestamp);

#if BIGENDIAN
    timestamp = (INT64)(((UINT64)timestamp >> 32) | ((UINT64)timestamp << 32));
#endif

    return timestamp;
}
FCIMPLEND;
Run Code Online (Sandbox Code Playgroud)

因此,它只是GetSystemTimeAsFileTimeUtcNow函数的包装器,并处理BigEndian的情况。

在微软发布其开源操作系统之前我们不能更进一步:)