【问题标题】:DateTime precision?日期时间精度?
【发布时间】:2012-11-06 11:07:39
【问题描述】:

(忽略优化的编译器标志)

此代码会在某些系统上进入块吗?

if (Datetime.Now!=Datetime.Now)
{
 ...
}

我的意思是,它如何评估这里的值? (是按顺序)?

是否存在条件可能为真的情况?

再次,忽略优化标志。

【问题讨论】:

  • 我猜是在一个非常慢的系统上。您只需要在调用之间有 1 个滴答声就可以使它们不同。
  • 我喜欢这个答案stackoverflow.com/a/2143784/570150
  • @leppie 其中“tick”表示系统计时器正在运行,而不是代表 100ns 的 Tick 单位。
  • @CodesInChaos:不,我指的是后者。或者至少某种形式的四舍五入,例如49.9ns vs 50ns
  • @RoyiNamir 它显示这些数字是的,但您会看到它们不会单独更改。在毫秒部分发生变化之前,它们将保持不变。

标签: c# .net datetime


【解决方案1】:

DateTime 的精度为 100ns。但在典型的实现中,DateTime.Now 仅每隔几毫秒更改一次。

Datetime.Now != Datetime.Now 可能是真的,但它极不可能发生。这是您在多线程代码中经常看到的典型竞争条件。也就是说,您不应该依赖 DateTime.Now 不会更改,而是将副本存储在局部变量中。

【讨论】:

  • 它是否与计算机频率时钟有关?
  • 它与影响定时器的内部系统定时器有关,Thread.SleepDateTime.NowEnvironment.TickCount,线程切换,...​​
  • 如果我没记错的话DateTime.Now 相对昂贵,因为它使用 IO。存储副本的另一个原因。编辑:这是我所指的链接:stackoverflow.com/q/10899709/284240
  • @TimSchmelter 很贵,因为需要做时区转换。 AFAIK 获得零件的实际时间相当便宜。在我的补偿中,DateTime.UtcNow 花费 9ns,DateTime.Now 花费 900ns。
【解决方案2】:

DateTime.Now 内部调用:

public static DateTime Now
{
    get
    {
        return DateTime.UtcNow.ToLocalTime();
    }
}

内部调用:

public static DateTime UtcNow
{
    get
    {
        long systemTimeAsFileTime = DateTime.GetSystemTimeAsFileTime();
        return new DateTime((ulong)(systemTimeAsFileTime + 504911232000000000L | 4611686018427387904L));
    }
}

其中GetSystemTimeAsFile 是返回系统 时钟信息的WindowsAPI 函数。准确度取决于系统,所以。

如果您有延迟,由于某些原因在不同的 get (DateTime.Now) 之间,它可能会产生足够不同的结果,导致相等比较器失败。但就我个人而言,在我的经验中,从未遇到过这种情况。

【讨论】:

  • 好吧,不:)如果有人会问这样的问题,我只能给出猜测,不知道前面的人以后会怎么想我这个:)
猜你喜欢
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 2023-03-07
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多