C# 如何计算DateTime.UtcNow值?

C# 如何计算DateTime.UtcNow值?,c#,.net,windows,time,timer,C#,.net,Windows,Time,Timer,.Net从何处获取此值?这是来自的值吗? 那么这个值是如何计算的呢?它是否以某种方式基于值?日期时间。UtcNow通过从当前日期/时间减去主机操作系统时区的偏移量来计算 是的,从ILSpy内部看,它正在调用: 为此,请使用手动拉取当前时区,这样您就可以从当前日期/时间中减去当前时区,例如: TimeZoneInfo tz_info = TimeZoneInfo.Local; TimeSpan offset = tz_info.BaseUtcOffset; DateTime now = DateT

.Net从何处获取此值?这是来自的值吗?
那么这个值是如何计算的呢?它是否以某种方式基于值?

日期时间。UtcNow
通过从当前日期/时间减去主机操作系统时区的偏移量来计算

是的,从ILSpy内部看,它正在调用:

为此,请使用手动拉取当前时区,这样您就可以从当前日期/时间中减去当前时区,例如:

TimeZoneInfo tz_info = TimeZoneInfo.Local;
TimeSpan offset = tz_info.BaseUtcOffset;
DateTime now = DateTime.Now;
DateTime utc_now = now.Subtract(offset);
请注意,这些值作为操作系统设置存储在注册表和其他位置。请记住,当您安装Windows时,您可以选择要进入的时区。如果你很勇敢,你可以在这里找到一些信息:

HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones


MSDN博客上有一篇关于时区等的优秀文章-

DateTime。UtcNow
通过从当前日期/时间减去主机操作系统时区的偏移量来计算

是的,从ILSpy内部看,它正在调用:

为此,请使用手动拉取当前时区,这样您就可以从当前日期/时间中减去当前时区,例如:

TimeZoneInfo tz_info = TimeZoneInfo.Local;
TimeSpan offset = tz_info.BaseUtcOffset;
DateTime now = DateTime.Now;
DateTime utc_now = now.Subtract(offset);
请注意,这些值作为操作系统设置存储在注册表和其他位置。请记住,当您安装Windows时,您可以选择要进入的时区。如果你很勇敢,你可以在这里找到一些信息:

HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones


MSDN博客上有一篇关于时区等的优秀文章-

UtcNow
的定义如下(为简洁起见,去掉了属性)


GetSystemTimeAsFileTime
定义为内部调用

[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
internal static extern long GetSystemTimeAsFileTime();
反射器帮不上忙了,让我们深入研究


GetSystemTimeAsFileTime
映射到
SystemNative::\uu GetSystemTimeAsFileTime
(ecall.cpp)

最后,
SystemNative::u GetSystemTimeAsFileTime
实现如下(comsystem.cpp)

FCIMPL0(INT64,SystemNative::u GetSystemTimeAsFileTime)
{
包装合同;
静态契约容忍;
INT64时间戳;
::GetSystemTimeAsFileTime((FILETIME*)和时间戳);
#如果是BIGENDIAN

timestamp=(INT64)((UINT64)timestamp>>32)|((UINT64)timestamp
UtcNow
定义如下。(为简洁起见,将属性剥离)


GetSystemTimeAsFileTime
定义为内部调用

[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
internal static extern long GetSystemTimeAsFileTime();
反射器帮不上忙了,让我们深入研究


GetSystemTimeAsFileTime
映射到
SystemNative::\uu GetSystemTimeAsFileTime
(ecall.cpp)

最后,
SystemNative::u GetSystemTimeAsFileTime
实现如下(comsystem.cpp)

FCIMPL0(INT64,SystemNative::u GetSystemTimeAsFileTime)
{
包装合同;
静态契约容忍;
INT64时间戳;
::GetSystemTimeAsFileTime((FILETIME*)和时间戳);
#如果是BIGENDIAN

timestamp=(INT64)((UINT64)timestamp>>32)|((UINT64)timestampWhow.人们检查IL而不是源代码

DateTime类的源位于

UtcNow从第959行开始


不需要使用反汇编程序、反射器或其他任何东西-您可以看到编写的代码。

哇。人们检查IL而不是源代码

DateTime类的源位于

UtcNow从第959行开始



不需要使用反汇编程序、反射器或其他任何东西-您可以看到编写的代码。

我认为询问者不想知道时区转换是如何执行的。事实上,我对实际值是如何推导的感兴趣。IlSpy?您是否想过只看源代码?@TomTom您想过吗?我可能不知道有吗?@Lloys有。你知道它在互联网上吗?检查我的答案。MS几年前就公开了。你能给“不可用”下个定义吗考虑到你需要做的只是去参考源网站?我不认为询问者想知道时区转换是如何执行的。事实上,我对实际值是如何推导的感兴趣。IlSpy?你有没有想过只看源代码?@TomTom有没有想过我可能没有它?@Lloys Ye啊。你知道它在互联网上吗?检查我的答案。MS几年前就公开了。你能给“不可用”下个定义吗考虑到你所需要做的就是去参考源网站?我的问题是为什么它的值来自哪里很重要。这是一个调用。
GetSystemTimeAsFileTime
internal
。所以..@DavidHeffernan,DateTime.UtcNow的精度是16ms。我有一个1ms的要求,不幸的是这变成了一个devel操作问题,因为需要不同的时钟。在我看来,这是一个典型的XY问题。我的问题是,为什么它的值来自哪里很重要。这是对的调用。
GetSystemTimeAsFileTime
internal
。所以..@DavidHeffernan,DateTime.UtcNow的精度是16ms。我有1ms的要求,而且不可原谅但是,这也成为了开发人员的问题,因为需要不同的时钟。在我看来,这是一个典型的XY问题。但是托管代码中没有实现任何东西。因此,检查源代码也不能提供太多的细节。但是托管代码中没有实现任何东西。因此,检查源代码也不能提供太多细节。
FCFuncStart(gDateTimeFuncs)
    FCFuncElement("GetSystemTimeAsFileTime", SystemNative::__GetSystemTimeAsFileTime)
FCFuncEnd()
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;