Я нашел, что это работает отлично, и браузер обрабатывает его в firefox. Я не проверял IE ...
<script>window.location='url'</script>
В качестве альтернативы:
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 );
}
А как насчет:
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».
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);
Если скорость является проблемой, следующий способ должен быть самым быстрым:
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 тиков).
Хорошее расширение Ханса Кестингса Ответ:
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 может не потребоваться.
РЕДАКТИРОВАТЬ: Адаптировал исправления, внесенные Гансом Кестингом в свой ответ.
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);
Чтобы улучшить некоторые другие методы, вот метод, который также сохранит тип 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);
}