2016-06-06 4 views

Antwort

3

54:33:00! = 54 Stunden, 20 Minuten und null Sekunden

ich Ihre Logik denken off so weit sein kann, als das, was Sie ausgeben als TimeSpan.TotalHours beabsichtigen, die Ausgabe wird ein Doppel-und nicht die richtige Anzahl von Minuten.

// Get your timespan (using the same number of minutes as expected) 
var timespan = TimeSpan.FromMinutes(3260); 
// This would output a double and not a string 
timespan.TotalMinutes; // yields 55.3333 (i.e. 54 hours and 1/3 or 20 minutes) 

So glaube ich nicht, dass Sie tatsächlich ausgeben 54:33:00 wollen würden, dass nicht richtig wären, da es 54 Stunden bedeuten würde, und 33 Minuten, wie auf den richtigen Wert von 54 Stunden und 20 Minuten gegenüber, die Sie können durch die String.Format() Methode tun:

// This would output 54:20:00, which should be your correct answer 
String.Format("{0:00}:{1:00}:{2:00}",(int)timespan.TotalHours, timespan.Minutes,0) 

So ein Beispiel Ihrer ursprünglichen Code könnte wie folgt aussehen:

var talktime = TimeSpan.FromMinutes((int)g.Sum(b => b.Field<int?>("talkTime"))); 
// Use your talktime to set your proper string variable 
TalkTime = String.Format("{0:00}:{1:00}:{2:00}",(int)talktime.TotalHours, talktime.Minutes,0); 

können Sie see a working example of this in action here.

+0

Um zu vermeiden, * Aufrunden * für 'timespan.TotalHour' (' 205,75 -> 206') zu tun, bitte wandeln es in 'int': 'String.Format (" ... ", (int) timespan.TotalHours, ...);' –

+0

Nice Catch Dmitry, ich habe den Zusatz entsprechend gemacht. –

0

TimeSpan.TotalHours gibt die aktuelle Uhrzeit in der TimeSpan Instanz in Stunden zurück. Also ist die 0,33 0,33 Stunde, nicht 33 Minuten. Mit Mathe und benutzerdefinierten Format können Sie erreichen, was Sie versuchen zu tun. Hier ein Beispiel:

var time = new TimeSpan(54, 21, 0); 
    var hours = System.Math.Floor(time.TotalHours); 
    var minutes = System.Math.Ceiling((time.TotalHours - hours) * 60); // you can also use time.Minutes 
    Console.WriteLine(string.Format("{0:00}:{1:00}:{2:00}", hours, minutes, 0)); 

Dies nimmt die Floor der TotalHours Eigenschaft, um die Stundenkomponente zu bestimmen, und berechnet die Minutenkomponente durch den Anteil der TotalHours Eigenschaft von 60. Multiplizieren Sie auch time.Minutes für die Minuten-Komponente verwenden .

+0

Ok. Ich ändere den Code, bekomme aber Fehler. Wie implementiere ich es in meinem linq Code: Stunden = TimeSpan.FromSeconds ((int) g.Sum (b => b.Field ("talkTime"))). TotalHours, Minuten = TimeSpan.FromSeconds ((int) g.Sum (b => b.Feld ("talkTime"))). TotalMinutes, seconeds = Zeitspannen.VonSekunden ((int) g.Summe (b => b.Feld ("talkTime"))) .TotalSeconds, TalkTime = string.Format ("{0:00}: {1:00}: {2:00}", Stunden, Minuten, Sekunden), –

+0

Ich glaube, Sie missverstehen die 'Total'-Eigenschaften. Es scheint, dass Sie denken, dass "TotalHours" die Stunden-Komponente enthält, "TotalMinutes" enthält die Minuten-Komponente. Dies ist nicht wahr, diese Eigenschaften halten die Gesamtzeit in Bezug auf die Einheit der Eigenschaft. Zum Beispiel, wenn Ihr 'TimeSpan' 2 für 'TotalHours' zurückgibt, bedeutet das, dass es 120 für 'TotalMinutes' und 7200 für 'TotalSeconds' zurückgibt. Wenn die Eigenschaften in dieselbe Einheit konvertiert werden (z. B. Millisekunden oder Ticks), führen sie daher zu demselben Ergebnis. – Tom

+0

Versuchen Sie Folgendes: var time = TimeSpan.FromSeconds ((int) g.Sum (b => b.Feld ("talkTime"))); var Stunden = System.Math.Floor (time.TotalHours); var minutes = System.Math.Ceiling ((time.TotalHours - Stunden) * 60); Console.WriteLine (string.Format ("{0:00}: {1:00}: {2:00}", Stunden, Minuten, 0)); – Tom

0

Ein Wert für TotalHours von 54,33 bedeutet nicht 54 Stunden und 33 Minuten, es bedeutet 54 Stunden + 33/100 Stunde, die 54 Stunden und 33 * 60/100 Minuten, was 54 Stunden und 19,8 Minuten oder ist 54 Stunden, 19 Minuten + 0,8 * 60 Sekunden = 48 Sekunden. Also 54,33 Stunden ist 54:19:48.

Angenommen, Sie möchten einen Wert von Dezimal 54,33 in einer Zeichenfolge 54:19:48 anzeigen, ist der beste Weg, eine Klasse zu erstellen, die sowohl IFormatProvice als auch ICustomFormater implementiert. Die ICustomFormatter.Format-Funktion führt die Formatierung für Sie die gleiche Art und Weise wie oben beschrieben:

  • Nehmen Sie die Gesamtstunden und nutzen Math.Floor auf eine Anzahl von Stunden abrunden.
  • Verwenden CultureInfo.DateTimeFormatInfo zu untersuchen, ob ein Semikolon oder einen Schrägstrich addieren, oder was auch immer seltsamer Charakter
  • Verwenden Sie den Rest * 60 die (dezimal) Anzahl der Minuten
  • erneut zu berechnen: Math.Floor zu berechnen die Anzahl der vollen Minuten und der Rest, um die Anzahl der Sekunden zu erhalten
  • Machen Sie dasselbe, um die Anzahl der Sekunden und die Anzahl der Millisekunden zu erhalten.

MSDN about IFormatProvider mit einem Beispiel dafür, was in ICustomFormatter.Format

Verwandte Themen