Я пытаюсь сравнить отметку времени из входящего запроса с сохраненным значением базы данных. Конечно, SQL Server сохраняет некоторую точность времени в миллисекундах, а при чтении в .NET DateTime он включает эти миллисекунды. Однако входящий запрос к системе не обеспечивает такой точности, поэтому мне нужно просто отбросить миллисекунды.
Я чувствую, что упускаю что-то очевидное, но я не нашел элегантного способа сделать это (C #).
string
представления aDateTime
, возможно, необходимо изменить, чтобы было ясно, что для «усечения» / «падение» миллисекунда означает «производитDateTime
значение , где все компоненты даты / времени одинаковы , за исключениемTimeOfDay.TotalMilliseconds
является0
.» Люди не читают, конечно, но просто чтобы устранить двусмысленность.Ответы:
Следующее будет работать для DateTime, который имеет доли миллисекунд, а также сохраняет свойство Kind (Local, Utc или Undefined).
или эквивалент и короче:
Это можно обобщить в метод расширения:
который используется следующим образом:
источник
источник
Вот метод расширения, основанный на предыдущем ответе, который позволит вам усечь любое разрешение ...
Использование:
Класс:
источник
источник
Millisecond
Свойство дает целое число от 0 до 999 (включительно). Таким образом, если, скажем, время суток до операции было23:48:49.1234567
равно целому числу123
, а время суток после операции равно23:48:49.0004567
. Таким образом, оно не усечено до целого числа секунд.Иногда вы хотите усечь что-то на основе календаря, например, год или месяц. Вот метод расширения, который позволяет вам выбрать любое разрешение.
источник
Вместо того чтобы отбрасывать миллисекунды, а затем сравнивать, почему бы не сравнить разницу?
или
источник
Менее очевидно, но более чем в 2 раза быстрее:
источник
d.AddMilliseconds(-d.Millisecond)
не обязательно перемещает DateTime точно на предыдущую, полную секунду.d.Ticks % TimeSpan.TicksPerMillisecond
тики (где-то между 0 и 9 999) за пределами вашей секунды останутся.Чтобы округлить до второго:
Заменить
TicksPerMinute
на округлить до минуты.Если ваш код чувствителен к производительности, будьте осторожны с
Мое приложение тратило 12% процессорного времени в System.DateTime.GetDatePart .
источник
Способ для легкого чтения ...
И больше...
источник
var now = DateTime.Parse(DateTime.Now.ToString())
работает просто отлично.Относительно ответа Диадистиса. Это сработало для меня, за исключением того, что мне пришлось использовать Floor для удаления дробной части деления перед умножением. Так,
становится
Я ожидал бы, что деление двух длинных значений приведет к длинному, удалив, таким образом, десятичную часть, но это разрешит его как двойное, оставляя точно такое же значение после умножения.
Eppsy
источник
2 Методы расширения для решений, упомянутых выше
использование:
источник
Не самое быстрое решение, но простое и понятное:
источник
И с помощью
:П
источник
string
вместоDateTime
, но это не включает компоненты времени с выхода полностью . (Это также делаетToday
ненужным доступ к собственности.)Новый метод
// определяем параметр передачи строки dd-mmm-yyyy return 24-feb-2016
Или показано в текстовом поле
// положить на PageonLoad
источник
string
вместоDateTime
, но это не включает компоненты времени с выхода полностью . (Это также делаетToday
ненужным доступ к собственности.)В моем случае я стремился сохранить TimeSpan из инструмента datetimePicker без сохранения секунд и миллисекунд, и вот решение.
Сначала преобразуйте datetimePicker.value в нужный вам формат, который у меня равен «ЧЧ: мм», затем преобразуйте его обратно в TimeSpan.
источник
string
) для этого будетDateTime datetime = datetimepicker1.Value; TimeSpan timeSpan = new TimeSpan(datetime.Hour, datetime.Minute, 0);
Либо вы можете использовать вариант метода расширения Джо, который работает соTimeSpan
значениями и используетTimeSpan timeSpan = datetime.TimeOfDay.Truncate(TimeSpan.FromSeconds(1));
для усечения секунд.Это моя версия методов расширения, опубликованная здесь и в похожих вопросах. Это проверяет значение тиков в удобном для чтения виде и сохраняет DateTimeKind исходного экземпляра DateTime. (Это имеет незначительные, но важные побочные эффекты при хранении в базе данных, такой как MongoDB.)
Если истинной целью является усечение DateTime до заданного значения (т. Е. Часов / минут / секунд / мс), я рекомендую вместо этого реализовать этот метод расширения в своем коде. Это гарантирует, что вы можете усекать только с правильной точностью, и сохраняет важные метаданные DateTimeKind вашего исходного экземпляра:
Затем вы можете использовать метод следующим образом:
источник
Я знаю, что ответ довольно поздно, но лучший способ избавиться от миллисекунд
Попробуйте напечатать значение переменной, она покажет время даты без миллисекунд.
источник