DateTime.Now.Ticks如何正常工作?

47 .net c# datetime

在我的应用程序中,我随机生成文件.为了确保独特的命名,我尝试使用自1970年1月1日以来的纳秒时间:

long time = DateTime.Now.Ticks;
String fileName = Convert.ToString(time);
Console.WriteLine(fileName);
Run Code Online (Sandbox Code Playgroud)

现在我发现了一些奇怪的东西.为什么输出是这样的?我的意思是为什么最后4个数字总是一样的?我可以使用它作为文件名,这不是问题,但我只是想知道它.

634292263478068039
634292263512888039
634292263541368039
634292263603448039
634292263680078039
Run Code Online (Sandbox Code Playgroud)

Nic*_*ver 41

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

  • 由于系统计时器.这与打开计算机或程序启动时没有任何关系.它取决于机器.可能的情况是,如果你在另一台机器上运行它,你会得到一个不同的结束数字. (6认同)
  • @Roflcoptr - 我不能说,这完全取决于你的系统时钟硬件......如果你在另一台带有不同主板的机器上尝试它,你可能会看到不同的结果. (2认同)

RB.*_*RB. 19

问题并不是你问题的答案,但我想我会关注你的总体目标.

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

请参见System.Path.GetTempFileNameGetRandomFileName.

或者,通常的做法是使用GUID命名随机文件.


Sha*_*ard 15

你可以使用这样的代码获得自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);
}
Run Code Online (Sandbox Code Playgroud)

  • @Noctis粗略舍入技术我习惯于将类型转换为整数/长整数.1.9将以这种方式转换为2,而不是1. (6认同)
  • o_O - >最后的+0.5是什么?! (5认同)

小智 5

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

DateTime.Now.ToFileTime();
Run Code Online (Sandbox Code Playgroud)

这应该可以解决你的目标

  • 不是我的反对票......但这会与“.Ticks”具有相同的时间分辨率问题。 (4认同)