繁体   English   中英

C# Epoch 日期时间转换

[英]C# Epoch DateTime conversion

我需要在 c# 中处理纪元时间,并且我创建了以下两个扩展方法来做到这一点:

public static DateTime ToDateTime(this double epochTime)
{
    return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(epochTime);
}

public static double ToEpochTime(this DateTime dt)
{
    var t = dt - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    return t.TotalSeconds;
}

运行以下测试时出现故障:

[Fact]
public void Test_EpochTime()
{
    var dateToTest = DateTime.Now;

    var epoch = dateToTest.ToEpochTime();
    var result = epoch.ToDateTime();

    Assert.Equal(result, dateToTest);
}

结果是:

Xunit.Sdk.EqualException: 'Assert.Equal() 失败

预计:2020-03-02T17:43:19.1830000Z

实际:2020-03-02T17:43:19.1831870+00:00'

以前有没有人遇到过这种情况,在 double/DateTime 之间转换时出现问题?

提前感谢您的任何指点!

double 只有足够的精度来保持到毫秒。 如果您想要更高的精度,则必须使用很长的DateTime.Ticks long 是一个确切的值,它不会改变。

如果你想要毫秒,那么正如@Magnetron 指出的那样,有内置的方法。 最重要的是,这是一般建议,如果您需要一个确切的值,请不要使用 double 或 float 类型。

对我来说,解决方案是更改和使用 Ticks 以提高精度(感谢 @iakobski)。 这是更新的扩展方法:

public static DateTime ToDateTime(this long epochTime)
{
    return new DateTime(1970, 1, 1, 0, 0, 0).AddTicks(epochTime);
}

public static long ToEpochTime(this DateTime dt)
{
    var t = dt.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0);
    return t.Ticks;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM