(извините за воскресение; я понимаю, что это старый и ответ на вопрос - просто добавив дополнительный код для Google.)
Я начал с ответа JayMcClellan , но затем я хотел, чтобы он был более общим, округляя до произвольных интервалов (не только 5 секунд). В итоге я оставил метод Джея для метода, который использует Math.Round
на тиках, и поместил его в метод расширения, который может принимать произвольные интервалы, а также предлагает возможность изменения логики округления (округление банкира против нуля). Я пишу здесь на случай, если это будет полезно и кому-то еще:
public static TimeSpan Round(this TimeSpan time, TimeSpan roundingInterval, MidpointRounding roundingType) {
return new TimeSpan(
Convert.ToInt64(Math.Round(
time.Ticks / (decimal)roundingInterval.Ticks,
roundingType
)) * roundingInterval.Ticks
);
}
public static TimeSpan Round(this TimeSpan time, TimeSpan roundingInterval) {
return Round(time, roundingInterval, MidpointRounding.ToEven);
}
public static DateTime Round(this DateTime datetime, TimeSpan roundingInterval) {
return new DateTime((datetime - DateTime.MinValue).Round(roundingInterval).Ticks);
}
Это не принесет никаких наград за чистую эффективность, но я нахожу это легким для чтения и интуитивно понятным в использовании. Пример использования:
new DateTime(2010, 11, 4, 10, 28, 27).Round(TimeSpan.FromMinutes(1)); // rounds to 2010.11.04 10:28:00
new DateTime(2010, 11, 4, 13, 28, 27).Round(TimeSpan.FromDays(1)); // rounds to 2010.11.05 00:00
new TimeSpan(0, 2, 26).Round(TimeSpan.FromSeconds(5)); // rounds to 00:02:25
new TimeSpan(3, 34, 0).Round(TimeSpan.FromMinutes(37); // rounds to 03:42:00...for all your round-to-37-minute needs