如何使用C#中的DateTime.Now.Ticks保持精度

iht*_*wot 7 .net c# datetime timestamp

我知道当我在C#中使用DateTime.Now.Ticks时它会返回一个long值,但是我需要将它存储在一个int变量中,我对是否能保持这种精度感到困惑.截至目前我只是一个演员

int timeStampValue = (int)DateTime.Now.Ticks;
Run Code Online (Sandbox Code Playgroud)

这是一个项目约束,所以我知道有大量的精度损失.我想我只是想不出另一种方法来存储一个存储在int中的时间戳,然后我可以将其与其他时间戳进行比较.

如果可能的话,任何关于如何保持精度的建议或建议将非常感激.

每个人的答案都是说明性的.我实际上最终只设置了一个涉及计数器的过程,当使用一个项目时,它的计数器设置为'0',所有其他计数器增加1.然后,最高计数器是下一个要使用的项目.

Ant*_*ram 13

DateTime.Now 并不是那么准确.

http://blogs.msdn.com/ericlippert/archive/2010/04/08/precision-and-accuracy-of-datetime.aspx

话虽如此,如果您将值转换为较小的类型,默认情况下您可以在任何情况下丢失数据.

考虑这个输出:

int.MaxValue:       2147483647
DateTime.Now.Ticks: 634075598514933010
Run Code Online (Sandbox Code Playgroud)

如何将这个转换成int是一个现实的选择?


San*_*har 11

你需要所有最重要的部分吗?(例如哪一年)

你需要所有最不重要的位吗?(例如亚纳秒精度)

您需要多长时间来衡量一下?

如果只需要毫秒精度,为什么不丢失最低有效位

int timeStamp = (int)(DateTime.Now.Ticks >> 10) // lose smallest 10 bits
Run Code Online (Sandbox Code Playgroud)

编辑

OP希望存储最近使用过的项目的时间:如果这是单个用户的用户选择,您可能不希望任何短于一秒的东西!因为每秒有10 ^ 7个滴答,所以长值中有log(10 ^ 7)/ log(2)= 23个超额位!

那么你需要多少空间?那么,你的价值观应该指明年,月,日,时,分和秒; 一年大约有3200万秒=大约24位.如果您想存储过去10年的价值,请添加3位.因此很容易融入int32.我建议

int timeStamp = (int)(DateTime.Now.Ticks >>23) // retain bits 23 to 55
Run Code Online (Sandbox Code Playgroud)