.Net究竟在哪裏取得這個值?這是來自GetSystemTimeAsFileTime的值嗎? 如何計算這個值呢?它不知何故基於QPC值?如何計算DateTime.UtcNow值?
回答
UtcNow
定義如下(剝離爲了簡潔屬性)
public static DateTime UtcNow
{
get
{
return new DateTime((ulong) ((GetSystemTimeAsFileTime() + 0x701ce1722770000L) | 0x4000000000000000L));
}
}
GetSystemTimeAsFileTime
被定義爲內部呼叫。
[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
internal static extern long GetSystemTimeAsFileTime();
反射不能再幫助,讓我們鑽進去sscli。
GetSystemTimeAsFileTime
映射到SystemNative::__GetSystemTimeAsFileTime
(ecall.cpp)
FCFuncStart(gDateTimeFuncs)
FCFuncElement("GetSystemTimeAsFileTime", SystemNative::__GetSystemTimeAsFileTime)
FCFuncEnd()
最後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;
所以,UtcNow
是一個簡單的包裝器GetSystemTimeAsFileTime功能,並處理BigEndian的情況。
我們不能走得更遠,直至微軟發佈它的開源操作系統:)
DateTime.UtcNow
通過從當前日期/時間減去主機操作系統時區的偏移來計算。
是的,在尋找ILSpy內部它被調用GetSystemTimeAsFileTime:
[SecurityCritical]
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern long GetSystemTimeAsFileTime();
要做到這一點手動拉使用TimeZoneInfo.Local當前時區,這給你一個BaseUtcOffset然後你就可以從當前日期減去/時間,例如:
TimeZoneInfo tz_info = TimeZoneInfo.Local;
TimeSpan offset = tz_info.BaseUtcOffset;
DateTime now = DateTime.Now;
DateTime utc_now = now.Subtract(offset);
請注意,這些值作爲操作系統設置存儲在註冊表中和以後。記住,當您安裝Windows,你選擇你想成爲什麼時區如果你是勇敢的,你可以找到一些信息在這裏:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
有一個關於時區等MSDN上的優秀文章博客 - http://blogs.msdn.com/b/bclteam/archive/2007/06/07/exploring-windows-time-zones-with-system-timezoneinfo-josh-free.aspx
Whow。人們檢查IL而不是源代碼。
DateTime類的來源是在http://referencesource.microsoft.com/#mscorlib/system/datetime.cs,df6b1eba7461813b
UtcNow開始於行959
無需使用反彙編器,反射器或其他任何東西 - 你可以看到代碼,因爲它是寫的。
但是在託管代碼中沒有實現。因此,檢查來源也不能提供很多見解。 – 2014-12-05 09:34:08
- 1. 計算持續時間無DateTime.UtcNow
- 2. 如何計算計數值?
- 3. Python:我如何模擬datetime.utcnow()?
- 4. 如何計算極限值
- 5. 如何計算輸入值
- 6. sql如何計算總值
- 7. 如何計算這個值?
- 8. 如何計算平均值?
- 9. 如何計算平均值?
- 10. 如何計算平均值?
- 11. 如何計算每行的foreach double值以計算爲單值?
- 12. 如何更改進程或線程的DateTime.UtcNow的值?
- 13. 如何計算幾何值在C#
- 14. R:如何計算計算字段列中的值R
- 15. 如何創建返回計算值的公共計算函數?
- 16. 如何計算MS reportviewer/rdlc中的平均計算平均值?
- 17. 如何計算MySQL中的計算平均值?
- 18. 如何計算一個計算的度量值?
- 19. 如何使用計算的值來計算另一個
- 20. 計算總計值
- 21. DateTime.UtcNow和GETUTCDATE()差異
- 22. 如何計算?
- 23. 如何計算
- 24. 如何計算
- 25. 如何使用子查詢計算值
- 26. 如何計算MultiMap的列表值?
- 27. 如何計算特定值的數量
- 28. 如何根據existin列計算列值
- 29. 如何將div分組並計算值?
- 30. 如何計算值的平均間隔?
我的問題是你的價值來自何處。 – 2014-12-05 09:13:43
這是對['GetSystemTimeAsFileTime'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms724397%28v=vs.85%29.aspx)的調用。 [來源](http://referencesource.microsoft。com /#mscorlib/system/datetime.cs,b0d5e4c9a8d4ddac) – dcastro 2014-12-05 09:15:45
'GetSystemTimeAsFileTime'是'internal'。所以.. – 2014-12-05 09:19:09