Je veux arrondir les dates / heures à l'intervalle le plus proche pour une application de cartographie. Je voudrais une signature de méthode d'extension comme suit afin que l'arrondi puisse ê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, cela arrondira à l'intervalle de dix minutes le plus proche. Je n'arrive pas à comprendre l'implémentation et j'espère que l'un de vous aura écrit ou utilisé quelque chose de similaire auparavant.
Je pense qu'un plancher, un plafond ou une mise en œuvre la plus proche convient parfaitement.
Des idées?
Edit: Grâce à @tvanfosson & @ShuggyCoUk, l'implémentation 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 s'appelle ainsi:
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));
...
À votre santé!