Desejo arredondar as datas / horas para o intervalo mais próximo para um aplicativo de gráficos. Eu gostaria de uma assinatura de método de extensão como a que se segue, para que o arredondamento possa ser obtido para qualquer nível de precisão:
static DateTime Round(this DateTime date, TimeSpan span);
A ideia é que, se eu passar em um intervalo de tempo de dez minutos, ele será arredondado para o intervalo de dez minutos mais próximo. Não consigo entender a implementação e espero que um de vocês tenha escrito ou usado algo semelhante antes.
Eu acho que um piso, teto ou a implementação mais próxima está bom.
Alguma ideia?
Edit: Graças a @tvanfosson & @ShuggyCoUk, a implementação é semelhante a esta:
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);
}
}
E é chamado assim:
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));
...
Felicidades!