Quiero redondear fechas/tiempos al intervalo más cercano para una aplicación de gráficos. Me gustaría una firma como método de extensión de la siguiente manera para que el redondeo se puede lograr por cualquier nivel de precisión:Rounding DateTime objects
static DateTime Round(this DateTime date, TimeSpan span);
La idea es que si paso en un intervalo de tiempo de diez minutos, se redondeará a la más cercana intervalo de diez minutos. No entiendo la implementación y espero que alguno de ustedes haya escrito o usado algo similar antes.
Creo que la implementación en el piso, en el techo o más cercana está bien.
¿Alguna idea?
Edit: Gracias a @tvanfosson & @ShuggyCoUk, la puesta en práctica se parece a esto:
public static class DateExtensions {
public static DateTime Round(this DateTime date, TimeSpan span) {
long ticks = (date.Ticks + (span.Ticks/2) + 1)/ span.Ticks;
return new DateTime(ticks * span.Ticks);
}
public static DateTime Floor(this DateTime date, TimeSpan span) {
long ticks = (date.Ticks/span.Ticks);
return new DateTime(ticks * span.Ticks);
}
public static DateTime Ceil(this DateTime date, TimeSpan span) {
long ticks = (date.Ticks + span.Ticks - 1)/span.Ticks;
return new DateTime(ticks * span.Ticks);
}
}
y se llama así:
DateTime nearestHour = DateTime.Now.Round(new TimeSpan(1,0,0));
DateTime minuteCeiling = DateTime.Now.Ceil(new TimeSpan(0,1,0));
DateTime weekFloor = DateTime.Now.Floor(new TimeSpan(7,0,0,0));
...
Salud!
Algunas de las implementaciones aquí podría ayudar también: http://stackoverflow.com/questions/766626/is-there- a-better-way-in-c-to-round-a-datetime-to-the-nearest-5-seconds –
posible duplicado de [¿Hay una mejor manera de recortar un DateTime a una precisión específica?] (http: //stackoverflow.com/questions/152774/is-there-a-better-way-to-trim-a-datetime-to-a-specific-precision) –
No te olvides de agregar el DateTimeKind original a la fecha recién creada ex : nuevo DateTime (ticks * span.Ticks, date.Kind); –