(Ci scusiamo per la risurrezione, riconosco che è un vecchio e rispose alla domanda - solo l'aggiunta di un po 'di codice aggiuntivo per l'amor di Google.)
ho iniziato con JayMcClellan's answer, ma poi ho voluto che fosse più generico, arrotondando al intervalli arbitrari (non solo 5 secondi). Così ho finito col lasciare il metodo di Jay per uno che usa Math.Round
su tick e lo metto in un metodo di estensione che può prendere intervalli arbitrari e offre anche l'opzione di cambiare la logica di arrotondamento (arrotondamento del banchiere contro lo zero).Sto postando qui nel caso in cui questo è utile a qualcun altro così:
public static TimeSpan Round(this TimeSpan time, TimeSpan roundingInterval, MidpointRounding roundingType) {
return new TimeSpan(
Convert.ToInt64(Math.Round(
time.Ticks/(decimal)roundingInterval.Ticks,
roundingType
)) * roundingInterval.Ticks
);
}
public static TimeSpan Round(this TimeSpan time, TimeSpan roundingInterval) {
return Round(time, roundingInterval, MidpointRounding.ToEven);
}
public static DateTime Round(this DateTime datetime, TimeSpan roundingInterval) {
return new DateTime((datetime - DateTime.MinValue).Round(roundingInterval).Ticks);
}
non vincerà alcun premio per l'efficienza a nudo, ma trovo facile da leggere e intuitivo da usare. Esempio di utilizzo:
new DateTime(2010, 11, 4, 10, 28, 27).Round(TimeSpan.FromMinutes(1)); // rounds to 2010.11.04 10:28:00
new DateTime(2010, 11, 4, 13, 28, 27).Round(TimeSpan.FromDays(1)); // rounds to 2010.11.05 00:00
new TimeSpan(0, 2, 26).Round(TimeSpan.FromSeconds(5)); // rounds to 00:02:25
new TimeSpan(3, 34, 0).Round(TimeSpan.FromMinutes(37); // rounds to 03:42:00...for all your round-to-37-minute needs
fonte
2010-11-05 18:26:55
Questo funziona bene perché 59 secondi arrotondati al 5 più vicino daranno 60, che non puoi passare come parametro "secondi" al costruttore DateTime. In questo modo eviti questa trappola. –
Sì, questo è un buon punto: ho perso questo problema nel mio codice ... – Damovisa
Un potenziale trabocchetto, per criticare la mia risposta, è che non sono sicuro di come i conti DateTime risalgano a secondi. Il conteggio delle zecche è misurato dalle 12:00:00 a mezzanotte, il 1 ° gennaio 0001. Pertanto, a seconda del numero di secondi intercalari da quel momento e se DateTime ne tiene conto, è possibile che il valore dei secondi risultante non sia un multiplo di 5. – JayMcClellan