Я беру различие между двумя полями 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);
}
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();
Вы можете использовать
double v = span.TotalHours;
v = Math.Round(v, MidpointRounding.AwayFromZero);
span = TimeSpan.FromHours(v);
Это зависит от того, правильно ли я понял ваши правила для отрицательных значений.