首页 > 解决方案 > 如何在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;
    }  

尝试使用此代码,但在日期时间中丢失微秒精度

标签: c#

解决方案


您需要调整代码以处理微秒。我们知道 1000 微秒 = 1 毫秒,因此 1/1000 毫秒是一微秒。现在,在 之后AddMillisecondsDateTime支持的下一个精度级别是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


推荐阅读