Ich möchte Datums- / Uhrzeitangaben für eine Diagrammanwendung auf das nächste Intervall runden. Ich möchte eine Signatur der Erweiterungsmethode wie folgt, damit die Rundung für jede Genauigkeitsstufe erreicht werden kann:
static DateTime Round(this DateTime date, TimeSpan span);
Die Idee ist, dass wenn ich in einer Zeitspanne von zehn Minuten vergebe, es auf das nächste Intervall von zehn Minuten gerundet wird. Ich kann mich nicht mit der Implementierung auseinandersetzen und hoffe, dass einer von Ihnen zuvor etwas Ähnliches geschrieben oder verwendet hat.
Ich denke, entweder ein Boden, eine Decke oder eine nächste Implementierung ist in Ordnung.
Irgendwelche Ideen?
Bearbeiten: Dank @tvanfosson & @ShuggyCoUk sieht die Implementierung folgendermaßen aus:
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);
}
}
Und heißt so:
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));
...
Prost!