Verwenden String.Format auf einem Timespan zur Ausgabe voller Sekunden ohne Millisekunden

StackOverflow https://stackoverflow.com/questions/3545508

  •  30-09-2019
  •  | 
  •  

Frage

Ich möchte eine Zeichenfolge, die die verstrichene Zeit zwischen zwei Terminen angezeigt werden soll.

Lassen Sie uns sagen, ich habe den folgenden Code:

DateTime date1 = DateTime.Now();
System.Threading.Thread.Sleep(2500);
DateTime date2 = DateTime.Now();

TimeSpan elapsed = date2.substract(date1);
Console.WriteLine("> {0:hh:mm:ss}", elapsed);

Was ich erwarten:

> 00:00:03

Was erhalte ich:

> 00:00:02.5002500

Gibt es eine Möglichkeit, die String.Format Funktion zu verwenden, um nur ganze Sekunden zurückkehren?
Ich habe auch versucht mit den Dezimalstellen zu entfernen:

elapsed = elapsed.Substract(TimeSpan.FromMiliseconds((double)Timespan.Miliseconds);

Aber das funktioniert auch nicht, da elapsed.Miliseconds kehrt 500 als Integer.

War es hilfreich?

Lösung

Ändern Sie den

Console.WriteLine("> {0:hh:mm:ss}", elapsed);

Console.WriteLine("> {0:hh\\:mm\\:ss}", elapsed);

.Net 4 können Sie benutzerdefinierte Format-Strings mit Zeitspanne verwenden. Sie können eine vollständige Referenz des verfügbaren Formatbezeich an dem Benutzerdefinierte Timespan-Format Strings Seite.

Sie müssen die entkommen „:“. Zeichen mit einem „\“ (die selbst entwertet werden müssen, wenn Sie eine wortgetreue Zeichenfolge verwenden)

Dieser Auszug aus dem MSDN Benutzerdefinierte Timespan Format Strings Seite erklärt, über die Flucht „:“ und „“ Zeichen in einem Format-String:

  

Die benutzerdefinierte Timespan Formatbezeichner enthält keine Platzhalter-Trennzeichen, wie die Symbole, die unterschiedlichen Tage von Stunden, Stunden von Minuten oder Sekunden von Sekundenbruchteilen. Stattdessen müssen diese Symbole in dem benutzerdefinierten Format-String als Stringliterale enthalten sein. Zum Beispiel: „dd.hh: mm“ definiert eine Periode als Trennzeichen zwischen den Tagen und Stunden, und einem Doppelpunkt (:) als Trennzeichen zwischen Stunden und Minuten

(.).

Andere Tipps

Leider ist es nicht möglich, eine TimeSpan in der gleichen Weise wie ein DateTime Wert zu formatieren. Sie können jedoch eine schnelle Konvertierung tun, weil beide Timespan und Datetime ihren Wert als Zecken speichern (in der Ticks Eigenschaft).

In Ihrem Code, der wie folgt aussehen:

Console.WriteLine("> {0:hh:mm:ss}", new DateTime(elapsed.Ticks));

UPDATE: Dies gilt für .NET 3.5 und früher, .NET 4 funktioniert Unterstützung Timespan Formatierung

.

Die TimeSpan Klasse Hours, Minutes und Seconds Eigenschaften, die jedes Mal Teil einzeln zurück. So könnten Sie versuchen:

String.Format(CultureInfo.CurrentCulture, "{0}:{1}:{2}", 
    elapsed.Hours, 
    elapsed.Minutes, 
    elapsed.Seconds)

Um das Format erhalten Sie wollen.

Es kann eine optimalere Art und Weise sein, aber ich habe festgestellt, es noch nicht.

Nach einem Blick auf ein paar Möglichkeiten, dies zu tun, bin ich leider mit einer hässlichen Antwort gelassen. Man kann nicht wirklich Ticks verwenden, da es nicht das Format richtig zurückkehrt, aber die folgende funktioniert:

DateTime date1 = DateTime.Now;
System.Threading.Thread.Sleep(2500);
DateTime date2 = DateTime.Now;

TimeSpan elapsed = date2.Subtract(date1);

string[] Split = elapsed.ToString().Split('.');

string m = Split[0]; // Returns 00:00:02

Hmm, das böse ist (wie sich herausstellt) - zumindest vor .NET 4.0

Wenn Sie hier gehen: http: / /msdn.microsoft.com/en-us/library/1ecy8h51(v=VS.90).aspx es wird Ihnen sagen, dass es kein Format Überlastung für eine Zeitspanne und dass Sie es zu tun haben, von Hand zB :

     span.Hours.ToString("00") + ":" + 
     span.Minutes.ToString("00") + ":" + 
     span.Seconds.ToString("00") + "."

Dies scheint - zumindest aus der Dokumentation - in .NET 4.0 festgelegt werden

Sie können dies tun:

dt.Subtract(TimeSpan.FromMilliseconds(dt.Millisecond)).ToString();

Es gibt folgenden benutzerdefinierten Formatbezeich y (Jahr), M (Monat), d (Tag), h (Stunde 12), H (Stunde 24), m (Minuten), s (Sekunden), f (zweite Fraktion ), F (zweite Fraktion, werden nachfolgende Nullen getrimmt), t (PM oder AM) und z (Zeitzone).

Die folgenden Beispiele zeigen, wie die Formatbezeich sind mit dem Ausgang neu geschrieben. [C #]

// create date time 2008-03-09 16:05:07.123    
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);    
String.Format("{0:y yy yyy yyyy}", dt);  // "8 08 008 2008"   year    
String.Format("{0:M MM MMM MMMM}", dt);  // "3 03 Mar March"  month    
String.Format("{0:d dd ddd dddd}", dt);  // "9 09 Sun Sunday" day    
String.Format("{0:h hh H HH}",     dt);  // "4 04 16 16"      hour 12/24
String.Format("{0:m mm}",          dt);  // "5 05"            minute
String.Format("{0:s ss}",          dt);  // "7 07"            second    
String.Format("{0:f ff fff ffff}", dt);  // "1 12 123 1230"   sec.fraction    
String.Format("{0:F FF FFF FFFF}", dt);  // "1 12 123 123"    without zeroes    
String.Format("{0:t tt}",          dt);  // "P PM"            A.M. or P.M.    
String.Format("{0:z zz zzz}",      dt);  // "-6 -06 -06:00"   time zone
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top