2012-03-19 4 views
7

У меня есть теория, почему следующий код не продуцирующие результаты мне нужно:Что такое самый простой способ удалить часть Millisecond в DateTime.UctNow.TimeOfDay?

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, без необходимости использовать огромное количество p время обработки? Это мое приложение довольно большое, и эта проблема довольно проста. Но когда это приложение будет развернуто, нет места для его неустойчивости. Эти миллисекунды должны быть обрезаны, поскольку они отправляются в хранимую процедуру в SQL Server, и эта конкретная хранимая процедура не поддерживает миллисекунды в DateTimes. Я также часто сталкиваюсь с этой проблемой, но обычно я конвертирую дату в строку (которая является литой по своему усмотрению), разбивает строку на полную остановку в миллисекундах и использует индексную позицию 0, чтобы получить нужное мне время. Есть более короткий, более эффективный способ?

Стабильность и скорость для меня важны.

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

+0

Не можете ли вы просто сделать '_myDate.Milliseconds = 0;'? – Alxandr

+3

экземпляры @Alxandr 'DateTime' неизменяемы, поэтому [' Миллисекунды'] (http://msdn.microsoft.com/en-us/library/system.datetime.millisecond.aspx) не имеет установленного свойства. –

+0

Зачем раскол, когда вы можете указать строковый формат без миллисекунд, вы могли бы снова разобрать его на 'DateTime' – V4Vendetta

ответ

8

Все, что вам нужно знать о настройке DateTime ToString format is here on MSDN.

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

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

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

+0

Почему я не думал об этом в прошлом месяце – Eon

+1

Также называется * Brain-fade * - Случается для всех нас :) –

7

Не используйте повторно свойство 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); 
+0

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

+1

Почему downvote? Если вы не объясните, что это такое, что вы считаете неправильным, оно не может улучшить ответ. – Guffa

-1

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

+0

Здесь не будет никакой пользы в использовании StringBuilder - это одно выражение, так что это будет один вызов String.Concat. –

4

В принципе, вы создаете новый экземпляр 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; 
2

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

DateTime d = DateTime.Now; 
var newDate = new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second); 
+0

Спасибо, что это сработало для меня !! –

Смежные вопросы