Я хочу округлити дати / часи до найближчого інтервалу для програми графіків. Мені хотілося б, щоб підпис методу розширення виглядав так, щоб округлення було досягнуто для будь-якого рівня точності:
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));
...
Ура!