(Извините за воскрешение; я понимаю, что это старый вопрос, на который дан ответ - просто добавляю дополнительный код для 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
person
Matt Winckler
schedule
05.11.2010