Как я могу указать самое позднее время дня с DateTime - PullRequest
65 голосов
/ 04 мая 2009

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

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

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

Ответы [ 10 ]

88 голосов
/ 04 мая 2009

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

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

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

var dt = new DateTime(Now.Year, Now.Month, Now.Day, 23, 59, 59);
69 голосов
/ 04 мая 2009

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

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
18 голосов
/ 04 мая 2009
DateTime d = DateTime.Today.AddDays(1).AddTicks(-1);
11 голосов
/ 04 мая 2009

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

Так что, если вы хотите, чтобы все даты в диапазоне включительно от 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)

UPDATE

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

6 голосов
/ 04 мая 2009
DateTime startDate = DateTime.Today;
DateTime stopDate = startDate.AddDays(1).AddTicks(-1);

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

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

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

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

2 голосов
/ 12 июня 2017

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

public static class DateTimeExtensions
{
    public static DateTime EndOfDay(this DateTime dateTime)
    {
        return dateTime.Date.AddDays(1).AddTicks(-1);
    }
}
1 голос
/ 23 марта 2017

Например

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

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

0 голосов
/ 28 сентября 2017

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

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
0 голосов
/ 14 апреля 2016

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

0 голосов
/ 13 апреля 2016

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

DateTime YourNewDate = new DateTime (YourDate .Year, YourDate .Month, YourDate .Day, 23, 59, 59, 99);

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