C# DateTime.Now.Ticks究竟是如何工作的?
在我的应用程序中,我随机生成文件。为了确保命名的唯一性,我从1970年1月1日开始尝试使用nano seconds:C# DateTime.Now.Ticks究竟是如何工作的?,c#,.net,datetime,C#,.net,Datetime,在我的应用程序中,我随机生成文件。为了确保命名的唯一性,我从1970年1月1日开始尝试使用nano seconds: long time = DateTime.Now.Ticks; String fileName = Convert.ToString(time); Console.WriteLine(fileName); 现在我看到了一些奇怪的东西。为什么输出是这样的?我是说为什么最后4个数字总是一样的?我可以用它作为文件名,这不是问题,但我只是想知道它 634292263478068039
long time = DateTime.Now.Ticks;
String fileName = Convert.ToString(time);
Console.WriteLine(fileName);
现在我看到了一些奇怪的东西。为什么输出是这样的?我是说为什么最后4个数字总是一样的?我可以用它作为文件名,这不是问题,但我只是想知道它
634292263478068039
634292263512888039
634292263541368039
634292263603448039
634292263680078039
的分辨率取决于您的系统计时器(在当前Windows操作系统上约为10ms)…因此它在那里给出了相同的结束值(没有比这更有限的值)。将当前日期时间转换为文件名以保存您可以使用的文件
DateTime.Now.ToFileTime();
这应该能解决你的目标这并不是对你的问题的回答,但我想我会插嘴谈谈你的总体目标 在.NET中已经有一种生成随机文件名的方法 见和
或者,使用GUID命名随机文件是一种常见做法。您可以使用以下代码获得自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);
}
我也有类似的问题 我还要看看这个答案:
大约一半是“Robert p”写的,其中有一些扩展函数我觉得很有用。但为什么它的末尾正好是39,而不是一个偶数?是的,或多或少很清楚,我只是想知道为什么即使我重新启动计算机或应用程序,它的值总是39。@Roflcoptr-我不能说,这最终取决于你的系统时钟硬件…如果你在另一台有不同主板的机器上尝试,你可能会看到不同的结果。因为系统计时器。这与计算机何时打开或程序何时启动无关。这取决于机器。如果你在另一台机器上运行它,很可能会得到不同的结束号码。需要注意的是,它的间隔并不总是10毫秒。使用flash启动chrome,它将下降到1ms。由于可以通过多媒体API在1到15毫秒之间设置内核计时。
计时
不是自1.1.1970以来的纳秒级
,因此您可能会与JavaScriptgetTime()
方法混淆。摘自msdn官方网站:此属性的值表示自0001年1月1日午夜12:00:00以来经过的100纳秒间隔数()准确地说,滴答声不是纳秒,滴答声表示100纳秒。单个滴答声表示100纳秒或1千万分之一秒。一毫秒内有10000个滴答声,或一秒钟内有1000万个滴答声。谢谢,但是这个方法会返回加密的图形名称,所以我只喜欢一些数字,它们的优点是可以很容易地相互比较GetRandomFileName
:我甚至不知道它们的存在@StevenRands我不相信GetRandomFileName
返回未使用的文件名,而GetTempFileName
返回未使用的文件名。@Dai这是正确的GetTimeFileName
实际上会在磁盘上创建一个(0字节)文件,而GetRandomFileName
只是返回一个可以用作文件名的字符串,因此可能会发生冲突(尽管可能性不大).不是我的反对票…但这将有与.Ticks
.o_o-->相同的时间分辨率问题结尾的+0.5是什么@Noctis粗糙的舍入技术,我习惯于将字体转换为整数/长。1.9将以这种方式转换为2,而不是1。有趣的是。。。当您将datetime转换为毫秒时,可能没有那么重要,但我会记住它以备将来使用……:)这是否适应午夜?@DanGifford是的,DateTime构造函数重载将小时、分钟和秒全部默认为0