Próbuję porównać znacznik czasu z przychodzącego żądania z wartością przechowywaną w bazie danych. SQL Server oczywiście zachowuje pewną precyzję w milisekundach czasu, a po wczytaniu do .NET DateTime uwzględnia te milisekundy. Przychodzące żądanie do systemu nie zapewnia jednak takiej precyzji, więc muszę po prostu upuścić milisekundy.
Czuję, że brakuje mi czegoś oczywistego, ale nie znalazłem eleganckiego sposobu na zrobienie tego (C #).
string
reprezentacji aDateTime
, być może konieczna jest edycja, aby wyjaśnić, że „obciąć” / „drop” milisekund znaczy „stworzyćDateTime
wartość gdzie wszystkie elementy data / czas są takie same z wyjątkiemTimeOfDay.TotalMilliseconds
jest0
”. Oczywiście ludzie nie czytają, ale po to, by wyeliminować wszelkie niejasności.Odpowiedzi:
Poniższe będzie działać dla DateTime, który ma ułamkowe milisekundy, a także zachowuje właściwość Kind (lokalna, utc lub niezdefiniowana).
lub równoważny i krótszy:
Można to uogólnić na metodę rozszerzenia:
który jest używany w następujący sposób:
źródło
źródło
Oto metoda rozszerzenia oparta na poprzedniej odpowiedzi, która pozwala obciąć do dowolnej rozdzielczości ...
Stosowanie:
Klasa:
źródło
źródło
Millisecond
Właściwość daje liczbę całkowitą w zakresie od 0 do 999 (włącznie). Więc jeśli pora dnia przed operacją była, powiedzmy,23:48:49.1234567
to ta liczba całkowita będzie123
, a pora dnia po operacji to23:48:49.0004567
. Więc nie skrócił się do pełnej liczby sekund.Czasami chcesz obciąć coś na podstawie kalendarza, na przykład rok lub miesiąc. Oto metoda rozszerzenia, która pozwala wybrać dowolną rozdzielczość.
źródło
Zamiast upuszczać milisekundy niż porównywać, dlaczego nie porównać różnicy?
lub
źródło
Mniej oczywiste, ale ponad 2 razy szybsze:
źródło
d.AddMilliseconds(-d.Millisecond)
niekoniecznie przenosi DateTime dokładnie do poprzedniej pełnej sekundy.d.Ticks % TimeSpan.TicksPerMillisecond
tiki (gdzieś pomiędzy 0 a 9 999) poza sekundą pozostaną.Aby zaokrąglić w dół do drugiej:
Zamień na,
TicksPerMinute
aby zaokrąglić w dół do minuty.Jeśli twój kod jest wrażliwy na wydajność, zachowaj ostrożność
Moja aplikacja spędzała 12% czasu procesora w System.DateTime.GetDatePart .
źródło
Sposobem na łatwe czytanie jest ...
I więcej...
źródło
var now = DateTime.Parse(DateTime.Now.ToString())
działa dobrze.Odnośnie odpowiedzi Diadistisa. To działało dla mnie, tyle że musiałem użyć Floor, aby usunąć ułamkową część podziału przed pomnożeniem. Więc,
staje się
Spodziewałbym się, że podział dwóch długich wartości da w wyniku Long, usuwając w ten sposób część dziesiętną, ale rozwiązuje to jako Double, pozostawiając dokładnie tę samą wartość po pomnożeniu.
Eppsja
źródło
2 Metody rozszerzenia wyżej wymienionych rozwiązań
stosowanie:
źródło
Nie najszybsze rozwiązanie, ale proste i łatwe do zrozumienia:
źródło
I przy użyciu
: P
źródło
string
zamiast aDateTime
, ale całkowicie pomija komponenty czasu w danych wyjściowych . (To sprawia, że dostęp doToday
nieruchomości również nie jest konieczny.)Nowa metoda
// zdefiniuj parametr Przekazanie ciągu dd-mmm-rrrr Zwróć 24-lut-2016
Lub pokazane na polu tekstowym
// włóż PageonLoad
źródło
string
zamiast aDateTime
, ale całkowicie pomija komponenty czasu w danych wyjściowych . (To sprawia, że dostęp doToday
nieruchomości również nie jest konieczny.)W moim przypadku chciałem zaoszczędzić TimeSpan z narzędzia datetimePicker bez zapisywania sekund i milisekund, a oto rozwiązanie.
Najpierw przekonwertuj datetimePicker.value na żądany format, który to mój „HH: mm”, a następnie przekonwertuj go z powrotem na TimeSpan.
źródło
string
), aby to zrobić,DateTime datetime = datetimepicker1.Value; TimeSpan timeSpan = new TimeSpan(datetime.Hour, datetime.Minute, 0);
Albo możesz użyć odmiany metody rozszerzenia Joe, która działa naTimeSpan
wartościach i użyć,TimeSpan timeSpan = datetime.TimeOfDay.Truncate(TimeSpan.FromSeconds(1));
aby skrócić sekundy.To jest moja wersja metod rozszerzenia opublikowanych tutaj i w podobnych pytaniach. Sprawdza to wartość tyknięć w łatwy do odczytania sposób i zachowuje DateTimeKind oryginalnej instancji DateTime. (Ma to subtelne, ale istotne skutki uboczne podczas przechowywania w bazie danych takiej jak MongoDB.)
Jeśli prawdziwym celem jest obcięcie DateTime do określonej wartości (tj. Godziny / Minuty / Sekundy / MS), zalecam zamiast tego wdrożenie tej metody rozszerzenia w kodzie. Zapewnia, że można obciąć tylko z prawidłową precyzją i zachowuje ważne metadane DateTimeKind oryginalnej instancji:
Następnie możesz użyć następującej metody:
źródło
Wiem, że odpowiedź jest dość późna, ale najlepszym sposobem na pozbycie się milisekund jest
Spróbuj wydrukować wartość zmiennej, pokaże datę i godzinę, bez milisekund.
źródło