c# - 如何在c#中将16位纪元时间戳转换为日期时间而不损失微秒精度
问题描述
public static DateTime ToDateTimeForEpochMSec(this double microseconds)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
DateTime tempDate = epoch.AddMilliseconds(microseconds / 1000);
return tempDate;
}
尝试使用此代码,但在日期时间中丢失微秒精度
解决方案
您需要调整代码以处理微秒。我们知道 1000 微秒 = 1 毫秒,因此 1/1000 毫秒是一微秒。现在,在 之后AddMilliseconds
,DateTime
支持的下一个精度级别是Ticks
,所以我们必须使用它。
我们可以使用以下方法找到毫秒内的滴答数TimeSpan
:
long ticksPerMillisecond = TimeSpan.TicksPerMillisecond;
如果 1 微秒是 1/1000 毫秒,那么我们需要 1/1000 的滴答声来表示一微秒。该文档将刻度定义为:
一百纳秒或百万分之一秒。一毫秒内有 10,000 个滴答声(请参阅 TicksPerMillisecond),一秒内有 1000 万个滴答声。
因此,我们应该安全地使用整数除法除以 1000:
long ticksPerMicrosecond = TimeSpan.TicksPerMillisecond / 1000;
现在我们可以将微秒数转换为滴答声:
long ticks = (long)(microseconds * ticksPerMicrosecond);
并将其添加到时代:
DateTime tempDate = epoch.AddTicks(ticks);
把它们放在一起,我们得到:
public static DateTime ToDateTimeForEpochMSec(this double microseconds)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
long ticksPerMicrosecond = TimeSpan.TicksPerMillisecond / 1000;
long ticks = (long)(microseconds * ticksPerMicrosecond);
DateTime tempDate = epoch.AddTicks(ticks);
return tempDate;
}
顺便说一句,我不确定为什么微秒在double
这里。看起来它会很好long
。
推荐阅读
- c# - 设置 CheckBoxes isChecked 默认 WPF MVVM (System.NullReferenceException)
- ruby-on-rails - 使用载波将图像保存在 ruby on rails 中的问题并且反应图像值为空
- r - tidyverse:有效地绑定列表元素
- r - 如何根据R中的一列列表将一个数据帧中的值加到另一个数据帧中
- shiny - 如何使用多个事件识别在 observeEvent 中触发的事件
- java - 我无法从不同类的数组中提取值
- node.js - 如何使用 nodemon 运行我的 nodejs 应用程序?
- node.js - 在 http-request 节点中发送文件的 Node-Red 不起作用
- django - 无法在 cpanel django 上提供媒体文件
- html - 如何防止图片标签拉伸图像?