DateTime.Now - первая и последняя минуты дня - PullRequest
38 голосов
/ 29 июля 2010

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

Ответы [ 10 ]

91 голосов
/ 29 июля 2010

Вот два расширения, которые я использую для этого.

    /// <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());
12 голосов
/ 29 июля 2010

Я бы использовал следующее:

DateTime now = DateTime.Now;
DateTime startOfDay = now.Date;
DateTime endOfDay = startOfDay.AddDays(1);

и используйте < endOfDay вместо <= endOfDay. Это будет означать, что он будет работать независимо от того, является ли точность минутами, секундами, миллисекундами, тиками или чем-то еще. Это предотвратит ошибки, подобные той, что была у нас в StackOverflow (хотя совет был игнорирован ).

Обратите внимание, что важно звонить DateTime.Now только один раз, если вы хотите, чтобы начало и конец того же дня.

10 голосов
/ 29 июля 2010

1001 * попробовать *

//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)
2 голосов
/ 15 июля 2013

Одна небольшая поправка к решению охотника выше ... Я использую следующий метод расширения, чтобы получить конец дня:

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 также вызовет исключение.

1 голос
/ 13 января 2016

Вы должны быть осторожны, чтобы использовать

(new DateTime()).AddDays(1).AddTicks(-1);

при передаче в хранимую процедуру.

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

1 голос
/ 09 мая 2013
    public static DateTime ToEndOfDay(this DateTime time)
    {
        var endOfDaySpan = TimeSpan.FromDays(1).Subtract(TimeSpan.FromMilliseconds(1));
        return time.Date.Add(endOfDaySpan);
    }
1 голос
/ 07 декабря 2012

Я бы посоветовал вам посмотреть на этот ответ: Как я могу указать самое позднее время дня с DateTime

Если ваши исходные DateTimes также потенциально включают время, использование метода AddDays () добавит целых 24 часа, что может быть не совсем тем, что вы хотите.

1 голос
/ 29 июля 2010

Как и другие ответчики, я не совсем уверен, о чем вы просите, но если вам нужно наименьшее возможное время и наибольшее возможное время (не только в течение дня), то есть DateTime.MinValue и DateTime.MaxValue которые возвращаются 01.01.00 00:00:00 и 31.12.9999 11:59:59 соответственно.

0 голосов
/ 23 ноября 2017
DateTime.Today.AddDays(1).AddSeconds(-1);

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

0 голосов
/ 30 сентября 2013

Обратите внимание, что если вы передаете это время серверу sql, вы должны использовать

dateTime.Date.AddDays(1).AddMilliseconds(-3);

См .:

Как получить последнее возможное время определенногодень

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...