2014-12-05 12 views
0

정확히 .Net이이 값을 사용하고 있습니까? 이 값은 GetSystemTimeAsFileTime입니까? 이 값은 어떻게 계산됩니까? 어떻게 든 QPC 값을 기반으로합니까?DateTime.UtcNow 값은 어떻게 계산됩니까?

+0

내 질문은 가치가 나오는 곳이 중요한 이유입니다. –

+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

+0

'GetSystemTimeAsFileTime'은 '내부'입니다. 그래서 .. –

답변

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

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 기능은 단순히 (comsystem.cpp) 아래로 구현됩니다 케이스는 BigEndian으로 처리합니다.

마이크로 소프트는 오픈 소스 운영 체제 : Whow

1

DateTime.UtcNow은 현재 날짜/시간에서 호스트 운영 체제 시간대의 오프셋을 뺀 값으로 계산됩니다. ILSpy에서 찾고

그리고 네는, 내부적으로는 GetSystemTimeAsFileTime를 호출 :

[SecurityCritical] 
[MethodImpl(MethodImplOptions.InternalCall)] 
internal static extern long GetSystemTimeAsFileTime(); 

이 수동으로 TimeZoneInfo.Local를 사용하여 현재 시간대를 당겨하려면이 당신에게 당신이 다음 현재 날짜에서 뺄 수있는 BaseUtcOffset을 제공합니다/시간 (예 :

)

이러한 값은 레지스트리 및 그 이상의 운영 체제 설정으로 저장됩니다. 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

Asker가 시간대 변환이 수행되는 방법을 알고 싶지 않다고 생각합니다. –

+0

사실, 나는 실제 가치가 파생되는 방법에 관심이있다. – Kimi

+0

IlSpy? 소스 코드를 살펴 본 적이 있습니까? – TomTom

0

을 출시까지 우리는 더 이상 갈 수 없습니다. 사람들은 소스 코드 대신 IL을 검사합니다. http://referencesource.microsoft.com/#mscorlib/system/datetime.cs,df6b1eba7461813b

UtcNow 라인 959

디스어셈블러, 반사 또는 다른 것을 사용할 필요에서 시작에서 날짜 시간 클래스의

소스입니다 - 성경에 기록 된대로 코드를 볼 수 있습니다.

+0

그러나 관리되는 코드에는 아무 것도 구현되어 있지 않습니다. 따라서 출처를 확인해도 많은 통찰력을 얻을 수는 없습니다. –

관련 문제