Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to deal with Rounding-off TimeSpan?

I take the difference between two DateTime fields, and store it in a TimeSpan variable, Now I have to round-off the TimeSpan by the following rules:

if the minutes in TimeSpan is less than 30 then Minutes and Seconds must be set to zero,
if the minutes in TimeSpan is equal to or greater than 30 then hours must be incremented by 1 and Minutes and Seconds must be set to zero.

TimeSpan can also be a negative value, so in that case I need to preserve the sign..

I could be able to achieve the requirement if the TimeSpan wasn't a negative value, though I have written a code I am not happy with its inefficiency as it is more bulky ..

Please suggest me a simpler and efficient method.

Thanks regards,

This is my code which works fine, when TimeSpan is not negative value ..

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 will contain the result ..

like image 583
InfantPro'Aravind' Avatar asked Apr 26 '10 14:04

InfantPro'Aravind'


3 Answers

How about:

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);
}
like image 62
Jon Skeet Avatar answered Oct 17 '22 07:10

Jon Skeet


You can use

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

It depends on whether I understood your rules for negative values correctly.

like image 37
Henk Holterman Avatar answered Oct 17 '22 06:10

Henk Holterman


TimeSpan is immutable, so you have to create a new one. This is also a perfect case for using extension methods in 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();
like image 3
LBushkin Avatar answered Oct 17 '22 06:10

LBushkin