Я хочу округлить даты/время до ближайшего интервала для приложения для диаграмм. Я бы хотел, чтобы подписи типа расширения, как следует, так, чтобы округление могло быть достигнуто для любого уровня точности:
static DateTime Round(this DateTime date, TimeSpan span);
Идея состоит в том, что если я пройду через десять минут, она округляется до ближайшего десятиминутного интервала. Я не могу окунуться в суть реализации и надеюсь, что один из вас написал или использовал что-то подобное раньше.
Я думаю, что пол, потолок или ближайшая реализация в порядке.
Любые идеи?
Изменить: Благодаря @tvanfosson и @ShuggyCoUk реализация выглядит следующим образом:
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);
}
}
И называется так:
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));
...
Ура!