Kim*_*imi 1 .net c# windows time timer
.Net 到底从哪里获取这个值?这是GetSystemTimeAsFileTime的值吗?那么这个值是如何计算的呢?它是否以某种方式基于QPC值?
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*)×tamp);
#if BIGENDIAN
timestamp = (INT64)(((UINT64)timestamp >> 32) | ((UINT64)timestamp << 32));
#endif
return timestamp;
}
FCIMPLEND;
Run Code Online (Sandbox Code Playgroud)
因此,它只是GetSystemTimeAsFileTimeUtcNow函数的包装器,并处理BigEndian的情况。
在微软发布其开源操作系统之前我们不能更进一步:)