【问题标题】:Why does TimeSpan.FromMinutes return incorrect total hours value为什么 TimeSpan.FromMinutes 返回不正确的总小时值
【发布时间】:2016-10-17 03:43:31
【问题描述】:

当我在 .netfiddle 上运行它时,我预计结果为 182 小时 30 分钟。但相反,我得到了 183 小时 - 这是为什么呢?就好像夏令时发生了?

TimeSpan tsTime = TimeSpan.FromMinutes((double)10950);
Console.WriteLine(tsTime.TotalHours.ToString("00") + ":" + tsTime.Minutes.ToString("00"));

【问题讨论】:

    标签: c# timespan


    【解决方案1】:

    因为 30 分钟是 0.5 小时,所以当您使用 ToString() 转换它时,它会将其设为整小时。所以四舍五入就可以解决问题了

    如果您想要四舍五入的输出,请将其四舍五入为您提供182:30

    TimeSpan tsTime = TimeSpan.FromMinutes((double)10950);
    Console.WriteLine(((int)tsTime.TotalHours).ToString("00") + ":" + tsTime.Minutes.ToString("00"));
    

    如果你想要实际的,那么它会给182.5:30

    Console.WriteLine(tsTime.TotalHours+ ":" + tsTime.Minutes);
    

    【讨论】:

    • 如果将原始分钟数加上 10 分钟,Math.Round 将不起作用。它将给出 183:40 但预期结果是 182:40
    【解决方案2】:
            TimeSpan tsTime = TimeSpan.FromMinutes((double)10950);
            Console.WriteLine(((int)tsTime.TotalHours).ToString("00") + ":" + tsTime.Minutes.ToString("00"));
    

    输出:

    182:30

    【讨论】:

      【解决方案3】:

      这是因为四舍五入。

      您正在通过ToString 输出一个双精度值,其格式根据标准规则将它们四舍五入为整数值,因此 0.5 向上舍入到下一个整数值。

      如果您检查实际值,您会发现它是预期的 182.5。

       Console.WriteLine(tsTime.TotalHours.ToString() + ":" + tsTime.Minutes.ToString());
      

      输出

      182.5:30

      您需要截断该值以获得整小时的总数(并且您可能会丢失 .ToString,因为这些值是整数

       Console.WriteLine(Math.Truncate(tsTime.TotalHours) + ":" + tsTime.Minutes);
      

      甚至:

       Console.WriteLine((int)tsTime.TotalHours + ":" + tsTime.Minutes);
      

      【讨论】: