2009-06-19 9 views
25

Nella mia uscita di una griglia, calcolo uno TimeSpan e prendo il suo TotalHours. per esempio.Gestisce intervalli di tempo negativi

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

L'obiettivo è quello di mostrare la TotalHours come 39:44, quindi ho bisogno di convertire il valore 7.5-07:30. Questo non è un problema ... a meno che non sia negativo!

posso creare un oggetto TimeSpan da Hours con

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

Se è negativo, non riesco a convertirlo in un DateTime di utilizzare il metodo .ToString("HH:mm"), e l'oggetto TimeSpan non supporta la stringa di formato.

+0

Che lingua? C#? –

+0

Ti preghiamo di prendere in considerazione la riformattazione dei frammenti di codice come codice inline o sezioni di codice e di aggiungere il tag di piattaforma appropriato (suppongo che sia .NET dai tuoi snippet). – OregonGhost

risposta

7

Basta moltiplicarlo per -1 o utilizzare una funzione di valore assoluto.

+41

Per chiunque lo abbia cercato su google: usa il metodo 'TimeSpan.Duration'. Da MSDN: "Restituisce un nuovo oggetto TimeSpan il cui valore è il valore assoluto dell'oggetto TimeSpan corrente". – prostynick

2

La soluzione più semplice sarebbe quella di fare:

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" 

Ciò inoltre funziona correttamente se il periodo è più lungo di 24 ore.

62

non v'è un metodo TimeSpan.Duration? Penso che questo gestirà ciò che stai cercando di fare.

+0

Questo è il modo più semplice, basta sottrarre i tuoi due DateTimes, chiamare Duration() sul risultato e quindi fare TotalHours. – Dan

1

Hi Ho lavorato questo in un po 'di codice che ho scritto, spero che aiuta

(risultati) è una variabile int

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

0

suo lavoro .try questo

mytimespam.Negate();

+3

time * spam *, hehe;) –

0

ho controllato ad ogni where.But i didnt get una risposta corretta per questo che ho usato in questo modo per terminare

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