Я хочу округлить дату / время до ближайшего интервала для графического приложения. Мне нужна подпись метода расширения, подобная приведенной ниже, чтобы округление могло быть достигнуто для любого уровня точности:
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));
...
Ура!
Ответы:
Пол
Округление (вверх в середине)
Потолок
источник
return new DateTime(ticks * span.Ticks, date.Kind);
Это позволит вам округлить до любого заданного интервала. Это также немного быстрее, чем деление, а затем умножение тактов.
источник
Вы также должны четко указать, хотите ли вы, чтобы округление:
Вполне вероятно, что вас действительно интересует только первый пункт, но в этих «простых» вопросах результирующее поведение может иметь далеко идущие последствия, поскольку вы используете его в реальном мире (часто с интервалами, близкими к нулю).
Решение tvanfosson охватывает все случаи, перечисленные в 1. Пример средней точки смещен вверх. Сомнительно, что это будет проблемой при округлении по времени.
источник
Просто используйте Ticks, используя это для деления, floor / ceil / округления значения и умножения его обратно.
источник
Если вы просто хотите округлить час до потолочного значения
источник