【问题标题】:How to deal with Rounding-off TimeSpan?如何处理四舍五入时间跨度?
【发布时间】:2011-02-12 10:35:35
【问题描述】:

我获取两个 DateTime 字段之间的差异,并将其存储在 TimeSpan 变量中,现在我必须通过以下规则对 TimeSpan 进行四舍五入:

如果 TimeSpan 中的分钟数小于 30,则 Minutes 和 Seconds 必须设置为零,
如果 TimeSpan 中的分钟数等于或大于 30,则小时数必须增加 1,并且分钟和秒数必须设置为零。

TimeSpan 也可以是负值,所以在这种情况下我需要保留符号..

如果 TimeSpan 不是负值,我可以达到要求,尽管我编写了一个代码,但我对它的低效率不满意,因为它更笨重..

请给我一个更简单有效的方法。

谢谢问候,

这是我的代码,当 TimeSpan 不是负值时可以正常工作..

TimeSpan time_span = endTime.Subtract(startTime);
            TimeSpan time_span1;
            if (time_span.Minutes >= 30)
            {
                time_span1 = new TimeSpan(time_span.Hours + 1, 0, 0);
            }
            else
            {
                time_span1 = new TimeSpan(time_span.Hours, 0, 0);
            }

time_span1 将包含结果..

【问题讨论】:

  • 请向我们展示您的代码
  • 你为什么不分享你的代码作为开始的基础?

标签: c# .net datetime timespan


【解决方案1】:

怎么样:

public static TimeSpan Round(TimeSpan input)
{
    if (input < TimeSpan.Zero)
    {
        return -Round(-input);
    }
    int hours = (int) input.TotalHours;
    if (input.Minutes >= 30)
    {
        hours++;
    }
    return TimeSpan.FromHours(hours);
}

【讨论】:

  • @jon,.NET V2.0 不支持,当我尝试触发转换时会弹出错误,如何修复错误??
  • @infant 程序员:“它弹出错误”并没有给我太多关于哪里出了问题的迹象。你遇到了什么错误?
  • @jon,是的,我很抱歉..实际上我无法用我的话解释错误,除了一般错误之外,还有一些与业务相关的东西,我已经复制了错误到一个文本文件,请在这里找到它:: sites.google.com/site/aravindspattar/NewTextDocument.txt
  • @infant:看起来这与您在 XSLT 中使用它比其他任何事情有关 - 我认为这与实际代码没有任何关系。将其更改为“返回输入”,我怀疑您会看到相同的行为。
【解决方案2】:

你可以使用

double v = span.TotalHours;     
v = Math.Round(v, MidpointRounding.AwayFromZero);
span = TimeSpan.FromHours(v);

这取决于我是否正确理解了您的负值规则。

【讨论】:

  • @Jon,是的,我只是在查找。
  • +1 这是 IMO 最直接的方法,甚至可以简化为一个不错的班轮。
【解决方案3】:

TimeSpan 是不可变的,因此您必须创建一个新的。这也是在 C# 中使用扩展方法的完美案例:

public static class TimeSpanUtility
{
   public static TimeSpan Round( this TimeSpan ts )
   {
       var sign = ts < TimeSpan.Zero ? -1 : 1;
       var roundBy = Math.Abs(ts.Minutes) >= 30 ? 1 : 0;
       return TimeSpan.FromHours( ts.TotalHours + (sign * roundBy) );
   }
}

// usage would be:
var someTimeSpan = new TimeSpan( 2, 45, 15 );
var roundedTime = someTimeSpan.Round();

【讨论】:

  • 你想要 TotalHours,否则 26 小时将变成 2 小时。
  • 感谢您的回复..您的代码也可以正常工作 :) 我想感谢您使用的逻辑 :)
猜你喜欢
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 2012-08-04
  • 2023-03-26
相关资源
最近更新 更多