Есть ли простой способ получить DateTime.Now
"TimeMin
" и "TimeMax
"?
DateTime.Now - первая и последняя минуты дня
Ответ 1
Вот два расширения, которые я использую для этого.
/// <summary>
/// Gets the 12:00:00 instance of a DateTime
/// </summary>
public static DateTime AbsoluteStart(this DateTime dateTime)
{
return dateTime.Date;
}
/// <summary>
/// Gets the 11:59:59 instance of a DateTime
/// </summary>
public static DateTime AbsoluteEnd(this DateTime dateTime)
{
return AbsoluteStart(dateTime).AddDays(1).AddTicks(-1);
}
Это позволяет вам написать:
DateTime.Now.AbsoluteEnd() || DateTime.Now.AbsoluteStart()
или
DateTime partyTime = new DateTime(1999, 12, 31);
Console.WriteLine("Start := " + partyTime.AbsoluteStart().ToString());
Console.WriteLine("End := " + partyTime.AbsoluteEnd().ToString());
Ответ 2
Я бы использовал следующее:
DateTime now = DateTime.Now;
DateTime startOfDay = now.Date;
DateTime endOfDay = startOfDay.AddDays(1);
и используйте < endOfDay
вместо <= endOfDay
. Это будет означать, что он будет работать независимо от того, являются ли точность минутами, секундами, миллисекундами, тиками или чем-то еще. Это предотвратит такие ошибки, как тот, который у нас был на StackOverflow (хотя совет был проигнорирован).
Обратите внимание, что важно только один раз вызвать DateTime.Now
, если вы хотите начать и завершить тот же день.
Ответ 3
попробовать
//midnight this morning
DateTime timeMin = DateTime.Now.Date;
//one tick before midnight tonight
DateTime timeMax = DateTime.Now.Date.AddDays(1).AddTicks(-1)
Если вы используете это для фильтрации, как показывают ваши комментарии, вероятно, стоит сохранить DateTime.Now в переменную, на всякий случай, если дата течет между двумя вызовами. Очень маловероятно, но назовите его достаточно раз, и это неизбежно произойдет однажды (ночь скорее).
DateTime currentDateTime = DateTime.Now;
DateTime timeMin = currentDateTime.Date;
DateTime timeMax = currentDateTime.Date.AddDays(1).AddTicks(-1)
Ответ 4
Одна маленькая настройка для решения охотника выше... Я использую следующий метод расширения, чтобы получить конец дня:
public static DateTime EndOfDay(this DateTime input) {
return input.Date == DateTime.MinValue.Date ? input.Date.AddDays(1).AddTicks(-1) : input.Date.AddTicks(-1).AddDays(1);
}
Это должно обрабатывать случаи, когда DateTime имеет значение DateTime.MinValue
или DateTime.MaxValue
. Если вы вызовете AddDays (1) в DateTime.MaxValue, вы получите исключение. Аналогично, вызов AddTicks (-1) в DateTime.MinValue
также генерирует исключение.
Ответ 5
Как и другие ответчики, я не совсем уверен, о чем вы просите, но если вы хотите минимально возможное время и максимально возможное время (не только через день), тогда DateTime.MinValue
и DateTime.MaxValue
которые возвращаются 1/1/0001 12:00:00 AM
и соответственно 12/31/9999 11:59:59.
Ответ 6
Я бы посоветовал вам посмотреть на этот ответ: Как указать последнее время дня с помощью DateTime
Если ваши исходные DateTimes также могут включать время, использование метода AddDays() добавит полные 24 часа, что может быть не совсем то, что вы хотите.
Ответ 7
public static DateTime ToEndOfDay(this DateTime time)
{
var endOfDaySpan = TimeSpan.FromDays(1).Subtract(TimeSpan.FromMilliseconds(1));
return time.Date.Add(endOfDaySpan);
}
Ответ 8
Вы должны быть осторожны, чтобы использовать
(new DateTime()).AddDays(1).AddTicks(-1);
когда он передается в хранимую процедуру.
Может случиться так, что значение будет приближено к следующему дню.
Ответ 9
Обратите внимание, что если вы передаете это время серверу sql, вы должны использовать
dateTime.Date.AddDays(1).AddMilliseconds(-3);
См:
Ответ 10
DateTime.Today.AddDays(1).AddSeconds(-1);
Не очень точный, но исправлены мои проблемы. Теперь мы можем использовать AddMilliseconds, AddTicks и т.д. Я думаю, что это будет просто отличаться от того, что удовлетворит ваши потребности.