【问题标题】:How does DateTime.Now.Ticks exactly work?DateTime.Now.Ticks 究竟是如何工作的?
【发布时间】:2011-06-01 01:08:21
【问题描述】:

在我的应用程序中,我随机生成文件。为了确保命名的唯一性,我从 1.1.1970 开始尝试使用纳秒:

long time = DateTime.Now.Ticks;
String fileName = Convert.ToString(time);
Console.WriteLine(fileName);

现在我观察到一些奇怪的事情。为什么输出是这样的?我的意思是为什么最后4个数字总是一样的?我可以将其用作文件名,这不是问题,但我只是想知道它。

634292263478068039
634292263512888039
634292263541368039
634292263603448039
634292263680078039

【问题讨论】:

  • Ticks 不是自 1.1.1970 以来的纳秒,您可能对 JavaScript getTime() 方法感到困惑。取自 msdn 官网:该属性的值表示自 0001 年 1 月 1 日午夜 12:00:00 以来经过的 100 纳秒间隔数 (msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx)
  • 准确地说,滴答声不是纳秒,滴答声旨在表示 100 纳秒。
  • 一个滴答表示一百纳秒或百万分之一秒。一毫秒有 10,000 个滴答声,或每秒有 1000 万个滴答声。 MSDN

标签: c# .net datetime


【解决方案1】:

将当前日期时间转换为文件名以保存您可以使用的文件

DateTime.Now.ToFileTime();

这应该可以解决您的目标

【讨论】:

  • 不是我的反对票...但这与.Ticks 存在相同的时间分辨率问题。
【解决方案2】:

我也遇到过类似的问题。

我也会看看这个答案:Is there a high resolution (microsecond, nanosecond) DateTime object available for the CLR?。

大约一半是“Robert P”的an answer,其中包含一些我发现有用的扩展功能。

【讨论】:

    【解决方案3】:

    您可以使用以下代码获取自 1970 年 1 月 1 日以来的毫秒数:

    private static DateTime JanFirst1970 = new DateTime(1970, 1, 1);
    public static long getTime()
    {
        return (long)((DateTime.Now.ToUniversalTime() - JanFirst1970).TotalMilliseconds + 0.5);
    }
    

    【讨论】:

    • o_O --> 最后的 +0.5 是什么?!
    • @Noctis 粗略舍入技术我习惯于在类型转换为整数/长整数时使用。 1.9 会以这种方式转换为 2,而不是 1。
    • 有趣...当您将日期时间转换为毫秒时可能并不那么重要,但我会记住未来... :)
    • 这可以容纳午夜吗?
    • @DanGifford 是的,DateTime 构造函数重载将小时、分钟和秒都默认为 0
    【解决方案4】:

    并不是真正回答您的问题,但我想我会插手您的总体目标。

    .NET 中已经有一种生成随机文件名的方法。

    请参阅 System.Path.GetTempFileName 和 GetRandomFileName。

    另外,使用 GUID 命名随机文件是一种常见的做法。

    【讨论】:

    • 谢谢,但是这个方法返回加密名称,所以我更喜欢一些数字,它们也有一个优点,就是很容易相互比较
    • GetRandomFileName: 我什至不知道它的存在!
    • @StevenRands 我不相信 GetRandomFileName 会返回 未使用 文件名,而 GetTempFileName 会。
    • @Dai 没错。 GetTimeFileName 实际上会在磁盘上创建一个(0 字节)文件,而 GetRandomFileName 只是返回一个您可以用作文件名的字符串,因此可能会发生冲突(尽管不太可能)。
    【解决方案5】:

    DateTime.Now 的分辨率取决于您的系统计时器(在当前的 Windows 操作系统上约为 10 毫秒)...所以它在那里给出相同的结束值(它不会比这更有限)。

    【讨论】:

    • 但是为什么最后正好是 39 而不是偶数呢?
    • 是的,它或多或少很清楚,我只是想知道为什么即使我重新启动计算机或应用程序,该值总是 39。
    • @Roflcoptr - 我不能说,这最终都取决于您的系统时钟硬件......如果您在另一台具有不同主板的机器上尝试它,您可能会看到不同的结果。
    • 因为系统定时器。这与打开计算机或启动程序的时间无关。这取决于机器。奇怪的是,如果你在另一台机器上运行它,你会得到一个不同的结束编号。
    • 需要注意的是,它并不总是 10 毫秒的间隔。用 flash 启动 chrome,它会下降到 1ms。因为内核节拍可以通过多媒体 API 设置在 1 到 15 毫秒之间。
    猜你喜欢
    • 2011-06-26
    • 2021-08-15
    • 2012-06-08
    • 2011-10-11
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    相关资源
    最近更新 更多