C#DateTime将长时间转换为1秒

Dag*_*oms 2 c# datetime

我发现DateTime转换为long,反之亦然.在测试转换后,我发现它们有时会提供与原始时间相差一秒的结果.这是一个Minimal,Complete和Verifiable示例

public static class DateTimeConstants
{
    public static readonly DateTime ZeroTime = 
        new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
}

public static class DateTimeExtensions
{
    public static long ToLong(this DateTime value)
    {
        return Convert.ToInt64((value.ToUniversalTime() - 
            ZeroTime).TotalSeconds)
    }
}

public static class LongExtensions
{
    public static DateTime ToDateTime(this long value)
    {
        var dateTime = ZeroTime.AddSeconds(value);
            return dateTime.ToLocalTime();
    }
}

public void ConvertDateTimeToLongAndBackTest()
{
    var initialDateTime = DateTime.Now;

    var longDateTime = initialDateTime.ToLong();

    var result = longDateTime.ToDateTime();

    Assert.AreEqual(result.Date, initialDateTime.Date);
    Assert.AreEqual(result.Hour, initialDateTime.Hour);
    Assert.AreEqual(result.Minute, initialDateTime.Minute);

    // Fails on the following line sometimes
    Assert.AreEqual(result.Second, initialDateTime.Second);
}
Run Code Online (Sandbox Code Playgroud)

有时,生成的DateTime与我为测试实例化的原始DateTime相同,但有时会关闭一秒钟.为什么是这样?

Lua*_*aan 6

好吧,因为你缩短了秒数,很明显你可以失去一秒精度.例如,12.8 seconds可能会打印出13舍入,但您的算法将其转换为12.如果你不使用相同的舍入,即使使用舍入也可能会遇到麻烦.

编辑:既然你已经实际添加了你的代码,我可以更具体 - DateTime.Second截断当前秒,同时Convert.ToInt64舍入它.所以12.8秒,你将获得第二个13而不是原来的12.修复很简单 - 用简单的强制转换替换转换.或者,如果您无法更改格式(即某人已经依赖于错误行为),请在日期时间内将测试更改为向上秒.

如果您想要unix时间,请使用unix时间.如果要使用二进制格式进行持久化,请使用ToBinary.不要试图制作自己的日期时间格式,日期不是简单的.