2012-03-19 7 views
7

Mam teorię, dlaczego następujący kod nie daje rezultatów, których potrzebuję:Jaka jest najłatwiejsza metoda usunięcia części Milisekundy z DateTime.UctNow.TimeOfDay?

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

Procesor musi obliczyć DateTime.UtcNow.TimeOfDay.Milliseconds, a ze względu na długość czasu jednego kleszcza CPU (a czasem do przetworzyć tę właściwość i zwracają wynik), to nie oznacza, że ​​DateTime.UtcNow.TimeOfDay.Milliseconds odejmie dokładną ilość milisekund określonych przez DateTime.UtcNow.TimeOfDay

muszę wiedzieć, co jest najprostszym i najbardziej skutecznym sposobem, aby usunąć ilość milisekund od DateTime.UtcNow.TimeOfDay, bez konieczności korzystania z ogromnej ilości p czas rocessor? Ta aplikacja jest dość duża, a ten problem jest dość prosty. Ale kiedy ta aplikacja zostanie wdrożona, nie ma miejsca na jej niestabilność. Te milisekundy muszą zostać przycięte, ponieważ są wysyłane do procedury składowanej w SQL Server, a ta konkretna procedura składowana nie obsługuje milisekund na DateTimes. Zazwyczaj napotykam również ten problem, ale zwykle konwertuję datę na ciąg (który jest rzutem własnym), dzielę ciąg znaków na kropkę w milisekundach i używam pozycji indeksu 0, aby uzyskać czas, którego potrzebuję. Czy istnieje krótszy, skuteczniejszy sposób?

Najważniejsze jest dla mnie stabilność i szybkość.

góry dzięki

+0

Nie możesz po prostu zrobić '_myDate.Milliseconds = 0;'? – Alxandr

+3

@Alxandr Instancje 'DateTime' są niezmienne, dlatego [' Milliseconds'] (http://msdn.microsoft.com/en-us/library/system.datetime.millisecond.aspx) nie ma właściwości set. –

+0

Dlaczego dzielić, gdy można określić format ciągu bez milisekund, można następnie sparsować go ponownie do 'DateTime' – V4Vendetta

Odpowiedz

8

Wszystko, co musisz wiedzieć o dostosowywaniu DateTime ToString format is here on MSDN.

W prostych słowach, coś takiego:

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

(zmiany formatu dowolnie)

+0

Dlaczego nie myślę o tym w zeszłym miesiącu – Eon

+1

Nazywany także * Zanik mózgu * - Zdarza się nam wszystkim :) –

7

Nie należy wielokrotnie używać właściwości tego samego wyrażenia. Uzyskać wartość raz i używać tej samej wartości w różnych miejscach:

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

Jeśli chcesz tylko datę sformatowaną w szczególny sposób, i nie potrzebują rzeczywistej wartości DateTime, można po prostu pominąć milisekundy w formacie, na przykład:

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

jak wysyłasz wartość do bazy danych, nie należy wysłać ją jako ciąg, ale jako wartość DateTime:

DateTime now = DateTime.Now; 
DateTime endDate = now - new TimeSpan(0, 0, 0, 0, now.TimeOfDay.Milliseconds); 
+0

Problem polega na tym, że jest procedura przechowywana, która chce wartość jako wartość varchar, choć jest to data. Zmuszony jestem naprawdę wysłać go jako ciąg. Będę pamiętał o twoim wpisie, kiedy pracuję z Datetimes w bazach danych. – Eon

+1

Dlaczego upadek? Jeśli nie wyjaśnisz, co to jest, że uważasz, że jest źle, to nie może poprawić odpowiedzi. – Guffa

-1

Zastosowanie C# DateTime formatting jak opisano bardzo dobrze w MSDN. Twoja analiza obliczeń milisekund jest prawdopodobnie błędna. Również dla konkatenacji ciągów użyj StringBuilder

+0

Nie byłoby żadnej korzyści z używania StringBuilder tutaj - to pojedyncze wyrażenie, więc byłoby jedno połączenie do String.Concat. –

4

Zasadniczo, tworzymy nową instancję DateTime z istniejącej, ale ustawiamy wszystko "mniejsze", a następnie Milisekundy na zero. Można użyć metody rozszerzenia:

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

Albo dla pełnego przykład przy użyciu kodu:

var now = DateTime.Now; 
endDate = now.AddDays(1).ToShortDateString() + " " + now.ZeroMilliseconds().TimeOfDay; 
2

Jeśli chcesz usunąć milisekund bez żadnego problemu na kleszcze.

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

Dziękuję, że zadziałało dla mnie !! –

Powiązane problemy