Как округлить часы на основе минут (часы + 0, если мин <30, часы + 1 в противном случае)?

Я нашел, что это работает отлично, и браузер обрабатывает его в firefox. Я не проверял IE ...

<script>window.location='url'</script>
13
задан John Saunders 23 March 2010 в 12:20
поделиться

7 ответов

В качестве альтернативы:

public static DateTime Round( DateTime dateTime )
{
    var updated = dateTime.AddMinutes( 30 );
    return new DateTime( updated.Year, updated.Month, updated.Day,
                         updated.Hour,  0, 0, dateTime.Kind );
}
31
ответ дан 1 December 2019 в 05:50
поделиться

А как насчет:

public static DateTime RoundToHours(DateTime input)
{
DateTime dt = new DateTime(input.Year, input.Month, input.Day, input.Hour, 0, 0);

    if (input.Minute > 29)
      return dt.AddHours(1);
    else
      return dt;
}

Нет необходимости преобразовывать в строку и обратно!

РЕДАКТИРОВАТЬ:
Использование input.Hour + 1 в конструкторе завершится ошибкой, если Hour равен 23. .AddHours (1) будет правильный результат на следующий день - «0:00».

6
ответ дан 1 December 2019 в 05:50
поделиться
  DateTime s = DateTime.Now;
  if (s.Minute > 30) s = s.AddHours(1); //only add hours if > 30
  if (s.Minute == 30 && s.Second > 0) s = s.AddHours(1); //add precision as needed
  s = new DateTime(s.Year, s.Month, s.Day, s.Hour, 0, 0);
3
ответ дан 1 December 2019 в 05:50
поделиться

Если скорость является проблемой, следующий способ должен быть самым быстрым:

static DateTime RoundToHour(DateTime dt){
    long ticks = dt.Ticks + 18000000000;
    return new DateTime(ticks - ticks % 36000000000, dt.Kind);
}

Это также довольно простой и понятный способ.

Чтобы объяснить, структура DateTime на самом деле не имеет полей, которые хранят год, месяц, день, час, минуту и т.д.. Она хранит одно единственное значение long - количество "тиков" с определенной эпохи (1 января 1 года нашей эры). Тик равен 100 наносекундам, или одной 10 000 000-й доле секунды.

Каждый раз, когда вы используете любое из свойств даты/времени, оно делится на соответствующую константу.

Так, здесь мы прибавляем константу, равную 30 минутам (30 * 60 * 1e7 = 18000000000 тиков), затем вычитаем остаток после деления на константу, равную одному часу (60 * 60 * 1e7 = 36000000000 тиков).

24
ответ дан 1 December 2019 в 05:50
поделиться

Хорошее расширение Ханса Кестингса Ответ:

public DateTime RoundToHours(DateTime input)
{
      DateTime dt = new DateTime(input.Year, input.Month, input.Day, input.Hour, 0, 0);
      return dt.AddHours((int)(input.Minutes / 30));
}

(int) Cast может не потребоваться.

РЕДАКТИРОВАТЬ: Адаптировал исправления, внесенные Гансом Кестингом в свой ответ.

3
ответ дан 1 December 2019 в 05:50
поделиться
DateTime dtm = DateTime.Now;
if (dtm.Minute < 30)
{
     dtm = dtm.AddMinutes(dtm.Minute * -1);
}
else
{    
     dtm = dtm.AddMinutes(60 - dtm.Minute);
}
dtm = dtm.AddSeconds(dtm.Second * -1);
1
ответ дан 1 December 2019 в 05:50
поделиться

Чтобы улучшить некоторые другие методы, вот метод, который также сохранит тип DateTime:

/// <summary>
/// Rounds a DateTime to the nearest hour.
/// </summary>
/// <param name="dateTime">DateTime to Round</param>
/// <returns>DateTime rounded to nearest hour</returns>
public static DateTime RoundToNearestHour(this DateTime dateTime)
{
  dateTime += TimeSpan.FromMinutes(30);

  return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, 0, 0, dateTime.Kind);
}
3
ответ дан 1 December 2019 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: