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

Как указать последнее время дня с помощью DateTime

Я использую объект System.DateTime, чтобы позволить пользователю выбирать диапазон дат. Пользователь может выбрать дату (а не время), используя календарь третьей стороны, поэтому мне нужно будет автоматически указать время суток, которое оно должно использовать (то есть: 00:00:00 или 23:59:59) после даты.

Как указать время после того, как дата уже сохранена как объект DateTime с помощью селектора календаря? Я мог бы использовать методы AddHours, AddMinutes, AddSeconds, но они относятся к текущему времени, которое может не быть 00:00:00.

В теге startDate должно быть время 00:00:00, а endDate - время 23:59:59 для учета всех дней.

4b9b3361

Ответ 1

Если у вас уже создан объект DateTime и вы хотите заменить это время на 11:59:59 PM за указанную дату, вы можете использовать свойство .Date, чтобы получить дату со временем, установленным на 00: 00:00, а затем добавьте часы, минуты и секунды. Например:

var dt = yourDateInstance.Date.AddHours(23).AddMinutes(59).AddSeconds(59);

Если в последнее время вы имеете в виду 11:59:59 PM, тогда это также должно работать:

var dt = new DateTime(Now.Year, Now.Month, Now.Day, 23, 59, 59);

Ответ 2

Чтобы получить последний момент на сегодня:

DateTime d = new DateTime(Now.Year, Now.Month, Now.Day);
d = d.AddDays(1);
d = d.AddTicks(-1);

В ответ на ваше редактирование, вот что я сделал бы:

DateTime start = new DateTime(Now.Year, Now.Month, Now.Day);
DateTime end = start.AddDays(1).AddTicks(-1);

// Or - just use end = start.AddDays(1), and use a < for comparison

Ответ 3

DateTime d = DateTime.Today.AddDays(1).AddTicks(-1);

Ответ 4

На ваш вопрос уже был дан ответ, но IMHO лучше не беспокоиться о том, чтобы попытаться вычесть тик, секунду или что-то еще с конца диапазона, и сравнить с использованием строго меньше.

Итак, если вы хотите, чтобы все даты в диапазоне включительно от startDate до endDate, игнорируя время, вы можете использовать следующее в С#:

if ((myDate >= startDate.Date) && (myDate < endDate.Date.AddDays(1)))
{
    // ... it in the range
}

или в T-SQL, если ваши @StartDate и @EndDate - точно в полночь, что-то вроде:

WHERE SomeDate >= @StartDate AND SomeDate < DATEADD(d,1,@EndDate)

UPDATE

Обновлен пример, чтобы отображать инклюзивный диапазон в ответ на комментарии.

Ответ 5

DateTime startDate = DateTime.Today;
DateTime stopDate = startDate.AddDays(1).AddTicks(-1);

В качестве примечания, DateTime.Today возвращает (из MSDN)

A System.DateTime установлен на сегодняшний день, с компонентом времени, установленным на 00:00:00.

Итак, как отметили другие, добавьте день, затем вычтите наименьший квант времени (галочку), и вы получите последнее возможное время для текущего дня.

Конечно, вам, возможно, придется подумать о TimeZones и таких, в зависимости от того, где код работает против того, где находится пользователь. Время UTC может быть хорошим, но это может повредить вам день (в любом случае) в зависимости от того, где работает ваш код.

Ответ 6

Например

DateTime.Now.Date.AddDays(1).AddSeconds(-1)

Или AddTicks/AddMilliseconds/AddMinutes... на основе необходимой точности.

Ответ 7

используйте этот

DateTime YourNewDate = новый DateTime (YourDate.Year, YourDate.Month, YourDate.Day, 23, 59, 59, 99);

Ответ 8

yourDateInstance.CloseDate = yourDateInstance.CloseDate.Date.AddDays(1).AddMilliseconds(-1);

Ответ 9

На основании других ответов я создал этот удобный метод расширения:

public static class DateTimeExtensions
{
    public static DateTime EndOfDay(this DateTime dateTime)
    {
        return dateTime.Date.AddDays(1).AddTicks(-1);
    }
}

Ответ 10

это даст вам ожидаемый результат:

DateTime startDate= DateTime.Now.Date;
DateTime endDate= startDate.AddDays(2).Add(new TimeSpan(23, 59, 59));
//startDate: 28/9/2017 0:0:0 endDate: 29/9/2017 23:59:59