Quiero redondear fechas / horas al intervalo más cercano para una aplicación de gráficos. Me gustaría una firma de método de extensión como la siguiente para que el redondeo se pueda lograr para cualquier nivel de precisión:
static DateTime Round(this DateTime date, TimeSpan span);
La idea es que si paso en un lapso de diez minutos, se redondeará al intervalo de diez minutos más cercano. No puedo entender la implementación y espero que alguno de ustedes haya escrito o usado algo similar antes.
Creo que una implementación de piso, techo o más cercana está bien.
¿Algunas ideas?
Editar: Gracias a @tvanfosson y @ShuggyCoUk, la implementación se ve así:
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!