2014-12-05 86 views
0

.Net究竟在哪裏取得這個值?這是來自GetSystemTimeAsFileTime的值嗎? 如何計算這個值呢?它不知何故基於QPC值?如何計算DateTime.UtcNow值?

+0

我的問題是你的價值來自何處。 – 2014-12-05 09:13:43

+0

這是對['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

+0

'GetSystemTimeAsFileTime'是'internal'。所以.. – 2014-12-05 09:19:09

回答

2

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*)&timestamp); 

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

    return timestamp; 
} 
FCIMPLEND; 

所以,UtcNow是一個簡單的包裝器GetSystemTimeAsFileTime功能,並處理BigEndian的情況。

我們不能走得更遠,直至微軟發佈它的開源操作系統:)

1

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

+3

我不認爲提問者想知道如何執行時區轉換。 – 2014-12-05 09:12:22

+0

事實上,我對如何得出實際價值感興趣。 – Kimi 2014-12-05 09:14:00

+0

IlSpy?你是否曾經想過只看源代碼? – TomTom 2014-12-05 09:27:56