如何应对Rounding-TimeSpan?

我取两个DateTime字段之间的区别,并将其存储在TimeSpan变量中,现在我必须通过以下规则来舍入TimeSpan:

如果TimeSpan中的分钟数小于30,那么分钟和秒必须设置为零,
如果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将包含结果..

怎么样:

 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); } 

您可以使用

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

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

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();