Подтвердить что ты не робот

DateTime.Now - первая и последняя минуты дня

Есть ли простой способ получить DateTime.Now "TimeMin" и "TimeMax"?

4b9b3361

Ответ 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);

когда он передается в хранимую процедуру.

Может случиться так, что значение будет приближено к следующему дню.

Ответ 10

DateTime.Today.AddDays(1).AddSeconds(-1);

Не очень точный, но исправлены мои проблемы. Теперь мы можем использовать AddMilliseconds, AddTicks и т.д. Я думаю, что это будет просто отличаться от того, что удовлетворит ваши потребности.