Je veux ronde dates/heures au plus proche de l'intervalle pour une application graphique. J'aimerais une méthode d'extension de signature comme suit, de sorte que l'arrondissement peut être obtenu pour n'importe quel niveau de précision:
static DateTime Round(this DateTime date, TimeSpan span);
L'idée est que si je passe dans un laps de temps de dix minutes, il va arrondir à la dizaine la plus proche minute d'intervalle. Je ne peux pas obtenir ma tête autour de la mise en œuvre et je suis en espérant que l'un d'entre vous l'ont écrit ou utilisé de quelque chose de semblable auparavant.
Je pense que ce soit un plancher, un plafond ou le plus proche de la mise en œuvre est très bien.
Des idées?
Edit: Merci à @tvanfosson & @ShuggyCoUk, la mise en œuvre ressemble à ceci:
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);
}
}
Et est appelé de la sorte:
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));
...
Cheers!