2014-12-05 2 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' является' internal'. Итак .. –

ответ

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.

Мы не можем идти дальше, пока Microsoft выпускает свой открытый источник операционной системы :)

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

Я не думаю, что искатель хочет знать, как выполняется преобразование часового пояса. –

+0

Действительно, меня интересует, как происходит фактическое значение. – Kimi

+0

IlSpy? Вам когда-нибудь приходилось просто смотреть на исходный код? – TomTom

0

Whow. Люди проверяют IL вместо исходного кода.

Источник класса DateTime находится в http://referencesource.microsoft.com/#mscorlib/system/datetime.cs,df6b1eba7461813b

UtcNow начинается в строке 959.

Нет необходимости использовать дизассемблер, рефлектор или что-нибудь еще - вы можете увидеть код, как это было написано.

+0

Но ничего не реализовано в управляемом коде. Таким образом, проверка источника также не дает большого понимания. –

Смежные вопросы