Domanda

voglio visualizzare il tempo trascorso tra due date in una stringa.

dire Let Ho il seguente codice:

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);

Quello che mi aspetto:

> 00:00:03

Quello che ottengo:

> 00:00:02.5002500

C'è un modo per utilizzare la funzione String.Format per restituire solo i secondi completi?
Ho anche cercato di rimuovere i decimali con:

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

Ma che non funziona nemmeno in quanto i rendimenti elapsed.Miliseconds 500 come numero intero.

È stato utile?

Soluzione

Cambia la

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

a

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

.Net 4 consente di utilizzare stringhe di formato personalizzato con Timespan. È possibile trovare un riferimento completo di identificatori di formato disponibili presso il Format MSDN personalizzato TimeSpan stringhe pagina.

È necessario sfuggire alla ":". Carattere con un "\" (che a sua volta deve essere sfuggito a meno che non si sta utilizzando una stringa verbatim)

Questo estratto da MSDN personalizzato TimeSpan Format Strings spiega circa sfuggire alla ":" e "". caratteri di una stringa di formato:

  

L'abitudine TimeSpan identificatori di formato non includono i simboli di separazione segnaposto, come ad esempio i simboli che giorni separati da ore, ore di minuti o secondi da frazioni di secondo. Invece, questi simboli devono essere inclusi nella stringa di formato personalizzato come stringhe letterali. Ad esempio, "dd.hh: mm" definisce un punto come separatore tra i giorni e ore, e due punti (:) come separatore tra ore e minuti

(.).

Altri suggerimenti

Purtroppo non è possibile formattare un TimeSpan nello stesso modo come un valore DateTime. È comunque possibile effettuare una conversione veloce perché sia ??TimeSpan e DateTime conservare il loro valore come zecche (nella proprietà Ticks).

Nel codice che sarebbe simile a questa:

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

UPDATE: Questo vale per .NET 3.5 e versioni precedenti, .NET 4 supporta la formattazione TimeSpan

.

La classe TimeSpan ha proprietà Hours, Minutes e Seconds che restituiscono ogni parte volta singolarmente. Così si potrebbe provare:

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

Per ottenere il formato desiderato.

Non ci può essere un modo più ottimale, ma non ho trovato ancora.

Dopo aver esaminato alcuni modi di fare questo, sto purtroppo lasciato con una risposta brutta. Non si può davvero utilizzare zecche, in quanto non restituisce il formato corretto, ma quanto segue funzionerà:

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, questo è brutto (come si scopre) - almeno prima di .NET 4.0

Se andate qui: http: / /msdn.microsoft.com/en-us/library/1ecy8h51(v=VS.90).aspx vi dirà che non c'è un sovraccarico formato per un periodo e che bisogna farlo a mano pe :

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

Questo sembra - almeno dalla documentazione - da fissare in .NET 4.0

si può fare questo:

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

Ci sono seguente formato personalizzato identificatori y (anno), M (mese), D (giorno), h (ore 12), H (24 ore), m (minuti), s (secondo), f (seconda frazione ), z (fuso F (seconda frazione, zeri finali vengono tagliati), t (PM o AM) ed).

A seguito esempi dimostrano come sono gli identificatori di formato riscritto per l'uscita. [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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top