Voglio arrotondare le date / ore all'intervallo più vicino per un'applicazione di creazione di grafici. Vorrei una firma del metodo di estensione come segue in modo che l'arrotondamento possa essere ottenuto per qualsiasi livello di precisione:
static DateTime Round(this DateTime date, TimeSpan span);
L'idea è che se passo in un lasso di tempo di dieci minuti, verrà arrotondato all'intervallo di dieci minuti più vicino. Non riesco a capire l'implementazione e spero che uno di voi abbia già scritto o utilizzato qualcosa di simile.
Penso che un pavimento, un soffitto o un'implementazione più vicina vada bene.
Qualche idea?
Modifica: grazie a @tvanfosson e @ShuggyCoUk, l'implementazione è simile a questa:
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 si chiama così:
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));
...
Saluti!