2009-06-19 15 views
25

En mi salida de una cuadrícula, calculo un TimeSpan y tomo su TotalHours. p.ej.Manejar tramos de tiempo negativos

(Eval("WorkedHours") - Eval("BadgedHours")).TotalHours 

El objetivo es mostrar la TotalHours como 39:44, por lo que necesita para convertir el valor a partir de 7.5 a 07:30. Esto no es problema ... ¡a menos que sea negativo!

que puede crear un objeto TimeSpan de Hours con

TimeSpan.FromHours((Eval("WorkedHours") - Eval("BadgedHours")).TotalHours) 

Si es negativo, no puedo convertirlo en un DateTime utilizar el método .ToString("HH:mm"), y el objeto TimeSpan no soporta la cadena de formato.

+0

qué idioma? DO#? –

+0

Considere volver a formatear los fragmentos de código como código en línea o secciones de código, y agregue la etiqueta de plataforma adecuada (supongo que .NET de sus fragmentos). – OregonGhost

Respuesta

7

Simplemente multiplíquelo por -1 o use una función de valor absoluto.

+41

Para cualquier persona que lo buscó en Google: use el método 'TimeSpan.Duration'. Desde MSDN: "Devuelve un nuevo objeto TimeSpan cuyo valor es el valor absoluto del objeto TimeSpan actual". – prostynick

2

La solución más sencilla sería hacer:

string format = "HH:mm"; 
if(hours < 0) 
    format = "-" + format; 

hours = Math.Abs(hours) 
9
static string ToHMString(TimeSpan timespan) { 
    if (timespan.Ticks < 0) return "-" + ToHMString(timespan.Negate()); 

    return timespan.TotalHours.ToString("#0") + ":" + timespan.Minutes.ToString("00"); 
} 

Console.WriteLine(ToHMString(TimeSpan.FromHours(3)));  //Prints "3:00" 
Console.WriteLine(ToHMString(TimeSpan.FromHours(-27.75))); //Prints "-28:45" 

Esto también funcionará correctamente si el intervalo de tiempo es más de 24 horas.

62

¿No hay un método TimeSpan.Duration? Creo que esto manejaría lo que estás tratando de hacer.

+0

Esta es la manera más fácil, simplemente reste sus dos DateTimes, llame a Duration() sobre el resultado, y luego haga TotalHours. – Dan

1

Hola me funcionó esto en un trozo de código que he estado escribiendo, creo que sirve

(resultados) es una variable int

(TimeSpan.FromMinutes(result)) < TimeSpan.Zero ? "-" + TimeSpan.FromMinutes(result).ToString(@"hh\:mm") : "" + TimeSpan.FromMinutes(result).ToString(@"hh\:mm");

0

su trabajo .try este

mytimespam.Negate();

+3

time * spam *, jeje;) –

0

yo nos registramos a cada where.But no tuve una respuesta correcta por eso utilicé esta manera de terminar

TimeSpan diff = actualout.Subtract(actualin); 
string a =(diff.ToString()).ToString(); 
if(a.Contains("-")) 
{   
diff = new TimeSpan(0,0,0,0); 
}