首页 > 解决方案 > 为什么 netcoreapp2.1 和 netcoreapp3.1 的 TimeSpan 值不同?

问题描述

当我从 netcoreapp2.1 转到 netcoreapp3.1 时,我注意到我的一些单元测试失败了。

以下代码有不同的结果:

using System;

namespace ConsoleApp12
{
    class Program
    {
        static void Main(string[] args)
    {
        var seconds = 0.81960;
        var timeSpan = TimeSpan.FromSeconds(seconds);

        Console.WriteLine($"seconds:{seconds}");
        Console.WriteLine($"timeSpan:{timeSpan}");
        Console.WriteLine($"timeSpan.Milliseconds:{timeSpan.Milliseconds}");
        Console.WriteLine($"timeSpan.Ticks:{timeSpan.Ticks}");
    }
    }
}

/*
core 2.1 and Framework 4.8 ROUNDS to nearest ms
seconds:0.8196
timeSpan:00:00:00.8200000
timeSpan.Milliseconds:820
timeSpan.Ticks:8200000
*/

/*
core 3.1 no longer rounds to nearest ms

seconds:0.8196
timeSpan:00:00:00.8196000
timeSpan.Milliseconds:819
timeSpan.Ticks:8196000
*/

这不是显示格式的事情,您可以从刻度的基础值中看出这一点。

为什么它们在 dotnet 核心版本之间有所不同?

标签: c#.net-core

解决方案


在 dotnet core 2.1 和 3.1(大约 2019 年底)之间,System.TimeSpan的行为发生了 变化,因此工厂方法不再四舍五入到最接近的 1ms。

这里有一个关于这个的 github 问题。

注意:当前文档尚未更新以反映行为变化,示例代码的输出现在在站点上不正确:System.TimeSpan.FromSeconds

在 .net core 2.1 和 Net Framework 中,创建的 TimeSpan 舍入到最接近的毫秒数:

      FromSeconds          TimeSpan
      -----------          --------
            0.001          00:00:00.0010000
           0.0015          00:00:00.0020000
          12.3456          00:00:12.3460000
      123456.7898        1.10:17:36.7900000
  1234567898.7654    14288.23:31:38.7650000
                1          00:00:01
               60          00:01:00
             3600          01:00:00
            86400        1.00:00:00
        1801220.2       20.20:20:20.2000000 

在 .net core 3.1 中,它没有四舍五入到最接近的 ms(例如 12.3456):

      FromSeconds          TimeSpan
      -----------          --------
            0.001          00:00:00.0010000
           0.0015          00:00:00.0015000
          12.3456          00:00:12.3455999
      123456.7898        1.10:17:36.7898000
  1234567898.7654    14288.23:31:38.7654000
                1          00:00:01
               60          00:01:00
             3600          01:00:00
            86400        1.00:00:00
        1801220.2       20.20:20:20.2000000

推荐阅读