DateTime до конца дня C#

Я получаю дату типа 1.01.2022 ч:00, м:00, с:00, мс:00

Как лучше всего получить дату в конце дня, например: 01.01.2022 ч: 23, м: 59, с: 59, мс: 999?

Я пробовал эти 2 способа:

var endOfDay = new TimeSpan(0, 23, 59, 59, 999);
time = time.Add(endOfDay);

и

time = time.AddDays(1).AddMilliseconds(-1);

Я выбираю второй путь, в основном потому, что считаю его более читабельным. Но ни один из них не является универсально лучшим. Возможно, вам следует объяснить, каковы ваши критерии наилучшего.

Jonathan Wood 21.11.2022 21:00

Для чего вам нужно это значение? Какое отношение вычисление значения времени в конце дня имеет к тому, как вы получаете строковое представление даты и времени?

Igor 21.11.2022 21:06

У меня есть средство выбора даты от dateFrom до dateTo и для dateTo. Я хочу установить время до конца дня для случая, когда пользователь выбирает одни и те же дни для dateFrom и dateTo.

John Jwick 22.11.2022 07:17

Что я обычно делаю, так это полностью игнорирую временной аспект. В блоке кода, который фактически выполняет фильтрацию, я добавлю 1 день к экземпляру dateTo DateTime, а затем использую less than сравнение. Пример, если выбранный dateTo был 2022-01-31, то в коде, который использует значение, я сделаю dateTo = dateTo.AddDays(1); и Where(x => x.EntityDate < dateTo)

Igor 22.11.2022 21:24
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
1
4
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это устраняет все сомнения вплоть до разрешения одного тика. В приведенном ниже коде предположим, что dateAndTime может включать ненулевой компонент времени.

dateAndTime.Date.AddDays(1).AddTicks(-1);

Этот

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

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

Если вы хотите просто распечатать диапазон, формат действия основан на мнении. Однако, если вы хотите проверить, находится ли какое-то время внутри дня или без него, сделайте это как (примечание >= и <)

 if (timeOfQuestion >= day.Date && timeOfQuestion < day.Date.AddDays(1)) {
   ...
 } 

Использование инструкций типа endOfDays = time.AddDays(1).AddMilliseconds(-1) опасно: обратите внимание, что day.Date.AddMilliseconds(999.5) - значение double - должно быть в пределах дня.

Другие вопросы по теме