Какой самый простой способ удалить часть миллисекунды DateTime.UctNow.TimeOfDay? - PullRequest
8 голосов
/ 19 марта 2012

У меня есть теория, почему следующий код не дает нужных мне результатов:

 endDate = DateTime.UtcNow.AddDays(1).ToShortDateString() + " " +    
      DateTime.UtcNow.TimeOfDay.Subtract(
         new TimeSpan(0, 0, 0, 0, DateTime.UtcNow.TimeOfDay.Milliseconds));

Процессор должен вычислить DateTime.UtcNow.TimeOfDay.Milliseconds, и из-за длительности одного такта ЦП (и времени, необходимого для обработки этого свойства и возврата результата), это не означает, что DateTime.UtcNow.TimeOfDay.Milliseconds будет вычитать точное количество миллисекунд, указанное в DateTime.UtcNow.TimeOfDay

Мне нужно знать, какой самый простой и эффективный метод для удаления количества миллисекунд из DateTime.UtcNow.TimeOfDay, без необходимости использовать огромное количество процессорного времени? Это мое приложение довольно большой, и эта проблема довольно проста. Но когда это приложение развернуто, нет места для его нестабильности. Эти миллисекунды должны быть обрезаны, поскольку они отправляются хранимой процедуре в SQL Server, и эта конкретная хранимая процедура не поддерживает миллисекунды в DateTimes. Я также часто сталкиваюсь с этой проблемой, но обычно я конвертирую дату в строку (которая сама по себе является приведением), разделяю строку на конечной точке в миллисекундах и использую позицию индекса 0, чтобы получить нужное мне время. Есть ли более короткий и эффективный способ?

Для меня важнее всего стабильность и скорость.

Заранее спасибо

Ответы [ 5 ]

8 голосов
/ 19 марта 2012

Не используйте повторно свойство Now / UtcNow в одном выражении.Получите значение один раз и используйте одно и то же значение в разных местах:

DateTime now = DateTime.Now;
endDate = now.AddDays(1).ToShortDateString() + " " +    
  now.TimeOfDay.Subtract(
     new TimeSpan(0, 0, 0, 0, now.TimeOfDay.Milliseconds));

Если вы хотите, чтобы дата форматировалась только особым образом, и вам не нужно фактическое значение DateTime, вы можете просто пропуститьмиллисекунды в формате, например:

endDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

Когда вы отправляете значение в базу данных, вы должны отправлять его не как строку, а как значение DateTime:

DateTime now = DateTime.Now;
DateTime endDate = now - new TimeSpan(0, 0, 0, 0, now.TimeOfDay.Milliseconds);
8 голосов
/ 19 марта 2012

Все, что вам нужно знать о настройке формата DateTime ToString, находится здесь, на MSDN.

Проще говоря, что-то вроде этого:

endDate = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd hh:mm:ss"); 

(измените формат по желанию)

4 голосов
/ 04 мая 2016

Если вы хотите удалить миллисекунды без проблем с тиками.

 DateTime d = DateTime.Now;
 var newDate = new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second);
3 голосов
/ 19 марта 2012

По сути, вы создаете новый DateTime экземпляр из существующего, но устанавливаете все «меньше», чем миллисекунды, на ноль. Вы можете использовать метод расширений:

public static class DateTimeExtensions
{
   public static DateTime ZeroMilliseconds(this DateTime dt)
   {
      return new DateTime(((dt.Ticks / 10000000) * 10000000), dt.Kind);
   }
}

Или для полного примера, используя ваш код:

var now = DateTime.Now;
endDate = now.AddDays(1).ToShortDateString() + " " + now.ZeroMilliseconds().TimeOfDay;
0 голосов
/ 19 марта 2012

Используйте C # DateTime форматирование , как очень хорошо описано в MSDN.Ваш анализ миллисекундных вычислений, вероятно, неверен.Также для конкатенации строк используйте StringBuilder

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