Как урезать миллисекунды с .NET DateTime

Я пытаюсь сравнить отметку времени от входящего запроса к хранящемуся значению базы данных. SQL Server, конечно же, сохраняет некоторую точность миллисекунд в то время, а при чтении в .NET DateTime он включает эти миллисекунды. Однако входящий запрос в систему не дает такой точности, поэтому мне нужно просто сбросить миллисекунды.

Я чувствую, что мне не хватает чего-то очевидного, но я не нашел элегантный способ сделать это (C #).

Следующие действия будут работать для DateTime, который имеет дробные миллисекунды, а также сохраняет свойство Kind (Local, Utc или Undefined).

DateTime dateTime = ... anything ... dateTime = new DateTime( dateTime.Ticks - (dateTime.Ticks % TimeSpan.TicksPerSecond), dateTime.Kind ); 

или эквивалент и короче:

 dateTime = dateTime.AddTicks( - (dateTime.Ticks % TimeSpan.TicksPerSecond)); 

Это можно обобщить на метод расширения:

 public static DateTime Truncate(this DateTime dateTime, TimeSpan timeSpan) { if (timeSpan == TimeSpan.Zero) return dateTime; // Or could throw an ArgumentException return dateTime.AddTicks(-(dateTime.Ticks % timeSpan.Ticks)); } 

который используется следующим образом:

 dateTime = dateTime.Truncate(TimeSpan.FromMilliseconds(1)); // Truncate to whole ms dateTime = dateTime.Truncate(TimeSpan.FromSeconds(1)); // Truncate to whole second dateTime = dateTime.Truncate(TimeSpan.FromMinutes(1)); // Truncate to whole minute ... 
 var date = DateTime.Now; date = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, date.Kind); 

Вот метод расширения, основанный на предыдущем ответе, который позволит вам усекать любое разрешение …

Применение:

 DateTime myDateSansMilliseconds = myDate.Truncate(TimeSpan.TicksPerSecond); DateTime myDateSansSeconds = myDate.Truncate(TimeSpan.TicksPerMinute) 

Класс:

 public static class DateTimeUtils { ///  /// Truncates a DateTime to a specified resolution. /// A convenient source for resolution is TimeSpan.TicksPerXXXX constants. ///  /// The DateTime object to truncate /// eg to round to nearest second, TimeSpan.TicksPerSecond /// Truncated DateTime public static DateTime Truncate(this DateTime date, long resolution) { return new DateTime(date.Ticks - (date.Ticks % resolution), date.Kind); } } 
 DateTime d = DateTime.Now; d = d.AddMilliseconds(-d.Millisecond); 

Вместо того, чтобы отбрасывать миллисекунды, а затем сравнивать, почему бы не сравнить разницу?

 DateTime x; DateTime y; bool areEqual = (xy).TotalSeconds == 0; 

или

 TimeSpan precision = TimeSpan.FromSeconds(1); bool areEqual = (xy).Duration() < precision; 

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

 public enum DateTimeResolution { Year, Month, Day, Hour, Minute, Second, Millisecond, Tick } public static DateTime Truncate(this DateTime self, DateTimeResolution resolution = DateTimeResolution.Second) { switch (resolution) { case DateTimeResolution.Year: return new DateTime(self.Year, 1, 1, 0, 0, 0, 0, self.Kind); case DateTimeResolution.Month: return new DateTime(self.Year, self.Month, 1, 0, 0, 0, self.Kind); case DateTimeResolution.Day: return new DateTime(self.Year, self.Month, self.Day, 0, 0, 0, self.Kind); case DateTimeResolution.Hour: return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerHour)); case DateTimeResolution.Minute: return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerMinute)); case DateTimeResolution.Second: return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerSecond)); case DateTimeResolution.Millisecond: return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerMillisecond)); case DateTimeResolution.Tick: return self.AddTicks(0); default: throw new ArgumentException("unrecognized resolution", "resolution"); } } 

Менее очевидна, но более чем в 2 раза быстрее:

 // 10000000 runs DateTime d = DateTime.Now; // 484,375ms d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond); // 1296,875ms d = d.AddMilliseconds(-d.Millisecond); 

Просто…

 //Remove milliseconds DateTime date = DateTime.Now; date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss", null); 

И более…

 //Remove seconds DateTime date = DateTime.Now; date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH:mm"), "yyyy-MM-dd HH:mm", null); //Remove minutes DateTime date = DateTime.Now; date = DateTime.ParseExact(date.ToString("yyyy-MM-dd HH"), "yyyy-MM-dd HH", null); //and go on... 

Что касается ответа Диадиста. Это сработало для меня, за исключением того, что мне пришлось использовать «Пол» для удаления дробной части деления до умножения. Так,

 d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond); 

становится

 d = new DateTime(Math.Floor(d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond); 

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

Eppsy

2 Методы расширения для упомянутых выше решений

  public static bool LiesAfterIgnoringMilliseconds(this DateTime theDate, DateTime compareDate, DateTimeKind kind) { DateTime thisDate = new DateTime(theDate.Year, theDate.Month, theDate.Day, theDate.Hour, theDate.Minute, theDate.Second, kind); compareDate = new DateTime(compareDate.Year, compareDate.Month, compareDate.Day, compareDate.Hour, compareDate.Minute, compareDate.Second, kind); return thisDate > compareDate; } public static bool LiesAfterOrEqualsIgnoringMilliseconds(this DateTime theDate, DateTime compareDate, DateTimeKind kind) { DateTime thisDate = new DateTime(theDate.Year, theDate.Month, theDate.Day, theDate.Hour, theDate.Minute, theDate.Second, kind); compareDate = new DateTime(compareDate.Year, compareDate.Month, compareDate.Day, compareDate.Hour, compareDate.Minute, compareDate.Second, kind); return thisDate >= compareDate; } 

Применение:

 bool liesAfter = myObject.DateProperty.LiesAfterOrEqualsIgnoringMilliseconds(startDateTime, DateTimeKind.Utc); 
 DateID.Text = DateTime.Today.ToShortDateString(); Use ToShortDateString() //Date 2-02-2016 Use ToShortDateString() // Time 

И по использованию

 ToLongDateString() // its show 19 February 2016. 

Новый метод

 String Date = DateTime.Today.ToString("dd-MMM-yyyy"); 

// определить параметр String pass dd-mmm-yyyy return 24-feb-2016

Или показано в текстовом поле

 txtDate.Text = DateTime.Today.ToString("dd-MMM-yyyy"); 

// нажимаем на PageonLoad

Чтобы округлить до второго:

 dateTime.AddTicks(-dateTime.Ticks % TimeSpan.TicksPerSecond) 

Замените TicksPerMinute чтобы округлить до минуты.


Если ваш код чувствителен к производительности, будьте осторожны

 new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second) 

Мое приложение тратило 12% процессорного времени в System.DateTime.GetDatePart .

  • Строка Parse C # в DateTime
  • Как преобразовать серийный номер даты Excel в .NET DateTime?
  • Как установить значение по умолчанию для столбца MySQL Datetime?
  • Как использовать DATETIME как DATE в mysql?
  • Использование фильтра даты и времени в формате AngularJS с датой UTC
  • Самый последний предыдущий рабочий день в Python
  • SimpleDateFormat, производящее неправильное время при parsingе "YYYY-MM-dd HH: mm"
  • Формат .NET DateTime «День» без начального нуля
  • Получение промежутка времени между двумя временами в C #?
  • Учитывая объект DateTime, как мне получить дату ISO 8601 в строчном формате?
  • Как вы определяете формат даты, используемый при маршалах JAXB xsd: dateTime?
  • Interesting Posts

    Как я могу заставить свой ноутбук отображать в 1366×768?

    Резервное копирование / восстановление Android: как создать резервную копию внутренней базы данных?

    Каковы преимущества файлов с отображением памяти?

    Поле заголовка запроса. Access-Control-Allow-Headers не разрешено самостоятельно в предполетном ответе

    Как работает строковая подстрока в Swift

    Замена символа в указанном индексе в строке?

    Расширенный поиск в Windows 7 только для имен папок

    Использование API-интерфейса Nexus для получения последней версии артефакта для данного groupid / artifactId

    Linq: В чем разница между Select и Where

    В чем разница (если есть) между Html.Partial (view, model) и Html.RenderPartial (view, model) в MVC2?

    Как передать параметры другому процессу в c #

    Сохранение UIColor и загрузка из NSUserDefaults

    Как добавить (вертикальный) разделитель в горизонтальный LinearLayout?

    Outlook 2007: ответ и пересылка не используются для форматирования по умолчанию

    как получить html-контент из веб-представления?

    Давайте будем гением компьютера.