C# 纪元日期时间转换
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() Failure
Expected: 2020-03-02T17:43:19.1830000Z
Actual: 2020-03-02T17:43:19.1831870+00:00'
有没有人遇到过这种情况,在 double/DateTime 之间转换时出现问题?
感谢提前指点!
对我来说,解决方案是更改并使用 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;
}
double 的精度只能保持到毫秒。如果你想要更高的精度,你将不得不使用 DateTime.Ticks
这是一个很长的。 long 是一个精确值,它不会改变。
如果你想要毫秒,那么正如@Magnetron 指出的那样,有内置的方法。最重要的是,这是一般性建议,如果您需要精确值,请不要使用双精度或浮点类型。
我需要在 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() Failure
Expected: 2020-03-02T17:43:19.1830000Z
Actual: 2020-03-02T17:43:19.1831870+00:00'
有没有人遇到过这种情况,在 double/DateTime 之间转换时出现问题?
感谢提前指点!
对我来说,解决方案是更改并使用 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;
}
double 的精度只能保持到毫秒。如果你想要更高的精度,你将不得不使用 DateTime.Ticks
这是一个很长的。 long 是一个精确值,它不会改变。
如果你想要毫秒,那么正如@Magnetron 指出的那样,有内置的方法。最重要的是,这是一般性建议,如果您需要精确值,请不要使用双精度或浮点类型。