(Lo siento por la resurrección; reconozco que es una vieja y respondió a la pregunta - simplemente añadiendo un poco de código extra por el amor de Google.)
Empecé con JayMcClellan's answer, pero luego quería que fuera más genérica, el redondeo a intervalos arbitrarios (no solo 5 segundos). Así que terminé dejando el método de Jay para uno que usa Math.Round
en ticks y lo puse en un método de extensión que puede tomar intervalos arbitrarios y también ofrece la opción de cambiar la lógica de redondeo (redondeo bancario versus cero fuera de cero).Quiero poner aquí en caso de que esto sea útil a alguien más, así:
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);
}
no va a ganar ningún premio por eficiencia desnudo, pero me resulta fácil de leer e intuitivo de usar. Ejemplo de uso:
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
Esto funciona bien porque 59 segundos redondeados al 5 más cercano arrojarán 60, que no se puede pasar como el parámetro 'segundos' al constructor DateTime. De esta manera evitas esa trampa. –
Sí, ese es un buen punto. Me olvidé de ese problema en mi código ... – Damovisa
Una posible trampa, criticar mi propia respuesta, es que no estoy seguro de cómo DateTime representa segundos intercalares. El conteo de ticks se mide a partir de las 12:00:00 de la medianoche del 1 de enero de 0001. Por lo tanto, dependiendo del número de segundos intercalares desde entonces y si DateTime los cuenta, puede encontrar que el valor de Segundos resultante no es un múltiplo de 5. – JayMcClellan