Есть простая функция для округления UPDateTime
до ближайших 15 минут?
Например
2011-08-11 16:59
становится 2011-08-11 17:00
2011-08-11 17:00
остается как 2011-08-11 17:00
2011-08-11 17:01
становится 2011-08-11 17:15
DateTime RoundUp(DateTime dt, TimeSpan d)
{
return new DateTime((dt.Ticks + d.Ticks - 1) / d.Ticks * d.Ticks, dt.Kind);
}
Пример:
var dt1 = RoundUp(DateTime.Parse("2011-08-11 16:59"), TimeSpan.FromMinutes(15));
// dt1 == {11/08/2011 17:00:00}
var dt2 = RoundUp(DateTime.Parse("2011-08-11 17:00"), TimeSpan.FromMinutes(15));
// dt2 == {11/08/2011 17:00:00}
var dt3 = RoundUp(DateTime.Parse("2011-08-11 17:01"), TimeSpan.FromMinutes(15));
// dt3 == {11/08/2011 17:15:00}
DateTime RoundUp(DateTime dt, TimeSpan d) { return new DateTime(((dt.Ticks + d.Ticks - 1) / d.Ticks) * d.Ticks, dt.Kind); }
Придумали решение, которое не предполагает умножения и деления
long
чисел.Использование:
источник
%d.Ticks
вRoundUp
необходимости?d.Ticks - (dt.Ticks % d.Ticks))
будет обязательно меньшеd.Ticks
, поэтому ответ должен быть таким же правильным?если вам нужно округлить до ближайшего временного интервала (не вверх), то я предлагаю использовать следующее
источник
Полученные результаты:
источник
2011-08-11 17:00:01
получает обрезается до2011-08-11 17:00:00
Так как я ненавижу изобретать велосипед, я, вероятно, следую этому алгоритму, чтобы округлить значение DateTime до указанного приращения времени (Timespan):
DateTime
округляемое значение в десятичное значение с плавающей запятой, представляющее целое и дробное числоTimeSpan
единиц.Math.Round()
.TimeSpan
единице.DateTime
значение из округленного числа тиков и верните его вызывающей стороне.Вот код:
источник
DateTime
, но я также хочу возможность округлять до несколькихunit
. ПереходMidpointRounding.AwayFromZero
кRound
не имеет желаемого эффекта. Есть ли у вас что-то еще, принимаяMidpointRounding
аргумент?Моя версия
Как метод, он будет блокировать, как это
и называется так
источник
Элегантный?
источник
Осторожно: приведенная выше формула неверна, то есть следующее:
должен быть переписан как:
источник
/ d.Ticks
округляется до ближайшего 15-минутного интервала (давайте назовем эти «блоки»), добавление только половины блока не гарантирует округления в большую сторону. Рассмотрим, когда у вас есть 4,25 блоков. Если вы добавите 0,5 блока, а затем проверьте, сколько у вас целочисленных блоков, у вас останется только 4. Добавление правильного действия на один тик меньше полного блока. Он гарантирует, что вы всегда переходите к следующему диапазону блоков (до округления вниз), но предотвращает перемещение между точными блоками. (IE, если вы добавили полный блок к 4,0 блокам, 5,0 округлились бы до 5, когда вы хотите, чтобы 4,99 были 4).Более подробное решение, которое использует модуль и избегает ненужных вычислений.
источник
Это простое решение для округления до ближайшей 1 минуты. Он сохраняет информацию о TimeZone и Kind для DateTime. Его можно изменить в соответствии с вашими потребностями (если вам нужно округлить до ближайших 5 минут и т. Д.).
источник
Вы можете использовать этот метод, он использует указанную дату, чтобы гарантировать, что он поддерживает любой тип глобализации и тип datetime, ранее указанный в объекте datetime.
.Net Fiddle Test
Если вы хотите использовать TimeSpan для округления, вы можете использовать это.
TimeSpan Fiddle
источник
var d = new DateTime(2019, 04, 15, 9, 40, 0, 0);
// должно быть 9:42, но ни один из этих методов не работает так?