我取两个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将包含结果..
答案 0 :(得分:10)
怎么样:
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);
}
答案 1 :(得分:4)
您可以使用
double v = span.TotalHours;
v = Math.Round(v, MidpointRounding.AwayFromZero);
span = TimeSpan.FromHours(v);
这取决于我是否正确理解了负值的规则。
答案 2 :(得分: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();