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!
Antworten:
Fußboden
Runde (auf Mittelpunkt)
Decke
quelle
return new DateTime(ticks * span.Ticks, date.Kind);
Auf diese Weise können Sie auf ein bestimmtes Intervall runden. Es ist auch etwas schneller als das Teilen und dann Multiplizieren der Zecken.
quelle
Sie sollten auch klar sein, ob Ihre Rundung:
Es ist sehr wahrscheinlich, dass Sie sich wirklich nur um den ersten Punkt kümmern, aber in diesen „einfachen“ Fragen kann das resultierende Verhalten weitreichende Konsequenzen haben, wenn Sie es in der realen Welt verwenden (oft in Intervallen neben Null).
Die Lösung von tvanfosson deckt alle in 1 aufgeführten Fälle ab. Das Mittelpunktbeispiel ist nach oben vorgespannt. Es ist zweifelhaft, dass dies ein Problem bei der zeitbezogenen Rundung wäre.
quelle
Verwenden Sie einfach die Häkchen, um den Wert zu teilen, zu decken, zu decken und zu multiplizieren.
quelle
Wenn Sie nur die Stunde auf den Deckenwert aufrunden möchten
quelle