【问题标题】:DateTime.UtcNow Not Change, Why?DateTime.UtcNow 没有改变,为什么?
【发布时间】:2011-12-08 19:31:32
【问题描述】:

检查代码

        StringBuilder s = new StringBuilder();
        for (var i = 0; i < 100; i++)
        {
            TimeSpan t = (DateTime.UtcNow - new DateTime(2010, 1, 1));
            ulong timestamp = (ulong)(t.TotalMilliseconds * 100000000);
            s.Append("<li>" + timestamp.ToString());
        }

您将得到相同的结果 100 次,这意味着即使我将毫秒乘以 100000000 次,DateTime.UtcNow 也不会改变。

这里有人知道如何每次都获得新鲜的 DateTime.UtcNow 吗?

【问题讨论】:

  • 作为建议,我现在使用代码: for (var i = 0; i " + DateTime.UtcNow.Ticks.ToString()) ; } 仍然没有区别,所有相同的字符串,为什么?整个 asp.net 项目中还有其他设置吗?
  • 无论如何,我需要得到一些作为rowkey的东西,所以无论如何这里都是按时间获取UNIQUE字符串,除了放置一些随机数的方式

标签: .net windows utc systemtime


【解决方案1】:

在如此紧密的循环中,您将获得相同的时间确实很好。

Ticks 属性中的每个刻度代表一个 100 纳秒的切片。您的代码会比这更快地迭代。

【讨论】:

  • 系统计时器以 16 毫秒的分辨率运行。
  • 最后,我使用刻度加上一些随机数字作为行键,它可以工作:)
【解决方案2】:

我只是将您的 sn-p 放入 LinqPad 并在 for 循环结束之前添加了一个 t.TotalMilliseconds.Dump(),这是前几个结果:

61068982141.4911    
61068982143.9916    
61068982143.9916    
61068982144.4917    
61068982144.4917    
61068982144.4917    
61068982144.4917    
61068982144.9918    
61068982144.9918    
61068982144.9918    
61068982144.9918    
61068982145.4919    
61068982145.4919    
61068982145.4919    
61068982145.4919    
61068982145.992    
61068982145.992    
61068982145.992    
61068982145.992

循环执行得相当快,你会看到小数点后的小数毫秒。

【讨论】:

    【解决方案3】:

    最好的方法是使用System.Diagnostics.Stopwatch类来测量高分辨率的时间跨度。在大多数计算机上,默认时钟间隔为 15.625 毫秒,这意味着在一个时钟间隔内,使用 DateTime.UtcNow 检索到的两个时间戳之差将为 0。Stopwatch 在可用时(即在大多数 PC 上)使用性能计数器,分辨率通常为小于 1 我们。详情请见Time Span Measurement in Managed Code

    【讨论】:

      猜你喜欢
      • 2022-12-06
      • 2017-06-23
      • 1970-01-01
      • 2018-02-11
      • 2018-11-21
      • 1970-01-01
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多