我有一个存储微秒级时间戳的仪器,我需要存储这些时间戳作为从仪器收集信息的一部分。这些时间戳由仪器本身使用高分辨率实时操作系统预先生成。解析这些值不是问题-它们使用UTC时间的标准格式存储。最初我想使用C# DateTime structure,它只能存储毫秒分辨率的时间戳。
是否有其他对象随.NET或通用C#库提供,支持微秒和(理想情况下)纳秒分辨率的时间戳,或者我将不得不滚动自己的时间戳?
我有一个存储微秒级时间戳的仪器,我需要存储这些时间戳作为从仪器收集信息的一部分。这些时间戳由仪器本身使用高分辨率实时操作系统预先生成。解析这些值不是问题-它们使用UTC时间的标准格式存储。最初我想使用C# DateTime structure,它只能存储毫秒分辨率的时间戳。
是否有其他对象随.NET或通用C#库提供,支持微秒和(理想情况下)纳秒分辨率的时间戳,或者我将不得不滚动自己的时间戳?
7条答案
按热度按时间lvjbypge1#
你也许可以使用
DateTime
。DateTime.Ticks
的分辨率是100纳秒。你可以用DateTime.AddTicks
设置刻度。o3imoua42#
通过查看答案和DateTime.Ticks属性,可以从给定的值计算微秒和纳秒。因此,我将此扩展方法类组合在一起来完成此操作。(遗憾的是,我认为如果有其他要求,我将无法使用它,但其他人可能会发现它很有用。)
这仍然不能让你在创建时设置微秒或纳秒,但它们可以在创建后不久添加。它也不能给予比DateTime更好的分辨率(例如,1/10微秒又名100纳秒分辨率)。
希望这对其他人有用!
jmp7cifd3#
如果我真的需要比
DateTime
提供的100 ns分辨率更高的精度,我会考虑创建一个包含DateTime
和一个整数值的结构:然后实施所需的任何内容,例如:
DateTime
,然后比较Nanoseconds
)ToString()
,例如,将日期时间格式设置为100 ns精度,然后附加纳秒。DateTime
/从DateTime
转换为DateTime
HiResTimeSpan
)...等....pdsfdshx4#
如果你想要一个在微秒的几分之一上运行的东西,那么不。你所要求的东西并不作为标准库的一部分存在,但是你所要求的,为什么你需要这个呢?听起来你真的需要两个组件,一个字符串(可变长度,hold几乎是任何可能的值)和一个你本机获得的UTC标准格式的日期/时间的DateTime。
微米/纳米级秒计时不在“正常”的计算范围内,因此“正常”的.NET库中没有提供。
你会用这些时间戳做什么?你会比较它们吗?加/减它们吗?我会建议运行基本DateTime对象的reflector(实际上我想我也会很快地这样做)
为了方便您,这里是标准DateTime对象的.NET Reflector反汇编的简单版本(由于在编辑时的另一个答案也建议使用TimeSpan元素)
iih3973s5#
我也在为同样的问题而挣扎,因为我有一个项目,我有皮秒分辨率的时间戳。我的源数据是“time_t”格式的,即自epoch以来的秒数+皮秒+ UTC偏移量。
我找到的最好的解决方案是使用“decimal seconds since epoch in UTC”作为我的内部时间格式,并且只使用DateTime作为一个漂亮的打印对象,以提取高达1秒分辨率的语言环境/格式,然后手动操作字符串以包括小数秒。
cnh2zyt36#
在.NET 7中,您可以顺便使用
DateTime.Microsecond
和/或DateTime.Nanosecond
属性,而无需创建自己的扩展方法,但它们 * 仍然 * 提供与Ticks
相同的精度。在.NET 7之前,各种日期和时间结构中可用的最小时间增量是
Ticks
属性中可用的“tick”。作为参考,一个tick是100 ns。开发人员传统上必须对“tick”值执行计算,以确定微秒和纳秒值。在.NET 7中,我们在日期和时间实现中引入了微秒和纳秒。dwbf0jvd7#
你可以用不同的方式来卷你自己的。
1.)使用System.Decimal字段创建一个结构作为“后备存储”。
2.)使用System.Numerics.BigInteger作为支持创建一个结构。
Package 方法以使用System.DateTime方便的“部件”(年、月、日...),包括您自己的纳秒、皮秒、飞秒等属性和方法。
仅供参考:
日期时间最大值刻度:3,155,378,975,999,999,999
小数。最大值:79,228,162,514,264,337,593,543,950,335
大整数:任意大!