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


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

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

The startDate потребуется время 00:00:00 и endDate имейте время 23: 59: 59, чтобы отчитаться за все дни.

10 58

10 ответов:

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

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

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

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

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

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
DateTime d = DateTime.Today.AddDays(1).AddTicks(-1);

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

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

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

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

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

обновление

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

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

Как Примечание, DateTime.Today возвращает (из MSDN)

Система.Дата и время установлены на сегодняшнюю дату, с компонентом времени, установленным в 00:00:00.

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

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

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

или AddTicks/AddMilliseconds/AddMinutes... основанный на точности вам.

использовать

DateTime YourNewDate = new DateTime (YourDate .Год, Ваша Дата .Месяц, Ваша Дата .День, 23, 59, 59, 99);

yourDateInstance.CloseDate = yourDateInstance.Закрыто.Дата.AddDays(1).AddMilliseconds(-1);

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

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

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

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