2010-04-26 36 views
5

que tomar la diferencia entre dos campos de fecha y hora, y almacenarlo en una variable intervalo de tiempo, ahora tengo que redondear el TimeSpan por las siguientes reglas:¿Cómo lidiar con TimeSpan de redondeo?

si los minutos en TimeSpan es inferior a 30 luego Minutos y Segundos se debe establecer en cero,
si los minutos en TimeSpan es igual o mayor que 30 entonces hora deben incrementa en 1 y Minutos y segundos debe establecerse en cero.

TimeSpan también puede ser un valor negativo, por lo que en caso de que necesite conservar el signo ..

yo podría ser capaz de alcanzar el requisito si la TimeSpan no era un valor negativo, a pesar de que he escrito un código que no estoy feliz con su ineficiencia ya que es más voluminoso ..

Por favor, me sugieren un método más simple y eficiente.

, gracias cordiales,

Este es mi código que funciona bien, cuando no es TimeSpan valor negativo ..

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 contendrá el resultado ..

+1

nos muestran el código que tiene, por favor –

+0

¿Por qué no dé su código como una base para empezar? –

+0

@ Josh, @Frank, ya seguro .. –

Respuesta

9

¿Qué tal:

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

@ Jon, no es compatible con .NET V2.0, que las ventanas emergentes de error cuando trato de activar la transformación, cómo solucionar el error ?? –

+0

programador @infant: "aparece un error" no me da mucha indicación de lo que está mal. ¿Qué error estás recibiendo? –

+0

@jon, ya, lo siento por eso ... en realidad no pude explicar el error en mis palabras, junto con los errores generales hay algunas cuestiones relacionadas con los negocios, he copiado el error en un archivo de texto, encuentre aquí :: http://sites.google.com/site/aravindspattar/NewTextDocument.txt –

4

Puede usar

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

Depende de si he entendido bien sus reglas para los valores negativos.

+0

Sospecho que querrías especificar un redondeo de punto medio en ese ... –

+0

@Jon, sí, solo estaba buscando eso. –

+0

+1 Esta es la forma más directa de hacerlo IMO, e incluso se puede reducir a un buen trazador de líneas. –

3

TimeSpan es inmutable, lo que tenga que crear una nueva. Esto también es un caso perfecto para el uso de los métodos de extensión en 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(); 
+0

Desea TotalHours; de lo contrario, 26 horas terminarán convirtiéndose en 2 horas. –

+0

@Jon Skeet: Sí, gracias. – LBushkin

+0

gracias por la respuesta .. tu código funciona bien también :) Me gustaría apreciar la lógica que has usado :) –