Dużo szukałem, ale nie mogłem znaleźć rozwiązania. Jak radzisz sobie z DateTime, który powinien być w stanie zawierać niezainicjowaną wartość (równoważną zeru)? Mam klasę, która może mieć ustawioną wartość właściwości DateTime lub nie. Zastanawiałem się nad zainicjowaniem właściciela właściwości na DateTime.MinValue, który następnie można łatwo sprawdzić. Myślę, że to dość częste pytanie, jak to robisz?
273
DateTime.MinValue
, a takżeMyNullableDate=date;
go ustawić,MyDate = MyNullableDate.Value;
czytać iif(MyNullableDate.HasValue)
sprawdzać, czy jest pustyJeśli używasz platformy .NET 2.0 (lub nowszej), możesz użyć typu zerowalnego:
lub
potem później:
Możesz sprawdzić wartość za pomocą:
Lub możesz użyć go w następujący sposób:
Możesz przeczytać więcej tutaj:
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx
źródło
dt.GetValueOrDefault()
- to najbardziej wydajna opcja.Data i godzina? MyDateTime {get; set;}
źródło
null
nie działa. To musi być(DateTime?)null
.Następujący sposób również działa
Należy pamiętać, że właściwość PublishDate powinna mieć datę i godzinę?
źródło
Rozważałbym użycie typów zerowalnych .
DateTime? myDate
zamiastDateTime myDate
.źródło
Warto zauważyć, że chociaż
DateTime
zmienna nie może byćnull
, nadal można ją porównaćnull
bez błędu kompilatora:źródło
Możesz użyć zerowalnej klasy.
źródło
DateTime
. Jak wcześniej wspomniano,new DateTime()
skutecznie da ci,DateTime.Min
podczas gdynew DateTime?()
spowoduje zero.W tym celu można użyć zerowej wartości DateTime.
lub to samo napisane w ten sposób:
źródło
Możesz ustawić DateTime na Nullable. Domyślnie DateTime nie ma wartości zerowej. Możesz ustawić zerowanie na kilka sposobów. Używasz znaku zapytania po typie DateTime? myTime lub za pomocą ogólnego stylu Nullable.
lub
źródło
Zawsze ustawiam czas na
DateTime.MinValue
. W ten sposób nie otrzymuję żadnego wyjątku NullErrorException i mogę porównać go z datą, o której wiem, że nie jest ustawiona.źródło
Ostrzegam - gdy używasz wartości Nullable, to oczywiście nie jest on już „czystym” obiektem typu data-godzina, dlatego nie możesz uzyskać bezpośredniego dostępu do elementów DateTime. Spróbuję wyjaśnić.
Używając Nullable <> zasadniczo pakujesz DateTime w pojemnik (dziękuję, generics), który jest zerowalny - oczywiście jego cel. Ten kontener ma własne właściwości, które można wywołać, co zapewni dostęp do wyżej wymienionego obiektu DateTime; po użyciu prawidłowej właściwości - w tym przypadku Nullable.Value - masz dostęp do standardowych elementów DateTime, właściwości itp.
Tak więc - teraz pojawia się kwestia najlepszego sposobu uzyskania dostępu do obiektu DateTime. Jest kilka sposobów, numer 1 jest według FAR najlepszy, a 2 to „stary dlaczego”.
Za pomocą właściwości Nullable.Value
DateTime date = myNullableObject.Value.ToUniversalTime(); //Works
DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails
Konwertowanie obiektu zerowalnego na datetime za pomocą Convert.ToDateTime (),
DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...
Chociaż odpowiedź jest w tej chwili dobrze udokumentowana, uważam, że użycie Nullable było prawdopodobnie warte opublikowania. Przepraszam, jeśli się nie zgadzasz.
edycja: Usunięto trzecią opcję, ponieważ była nieco zbyt szczegółowa i zależała od wielkości liter.
źródło
Chociaż wszyscy już udzielili ci odpowiedzi, wymienię sposób, który ułatwia przekazanie daty i godziny do funkcji
[BŁĄD: nie można przekonwertować system.datetime? do system.datetime]
Teraz możesz przekazać dte do funkcji bez żadnych problemów.
źródło
Jeśli czasami oczekujesz wartości zerowej, możesz użyć czegoś takiego:
W swoim repozytorium użyj zerowej daty i godziny.
źródło
Miałem ten sam problem, co musiałem podać Null jako parametr dla DateTime podczas wykonywania testu jednostkowego dla Throw ArgumentNullException. W moim przypadku zadziałało to przy użyciu następującej opcji:
źródło
Biorąc pod uwagę charakter typu danych data / czas, nie może on zawierać
null
wartości, tzn. Musi zawierać wartość, nie może być pusty ani niczego. Jeśli zaznaczysz zmienną daty / godziny jako taką,nullable
wówczas możesz przypisać do niej wartość zerową. Więc to, co chcesz zrobić, to jedna z dwóch rzeczy (może być więcej, ale mogę myśleć tylko o dwóch):Przypisz minimalną wartość daty / godziny do swojej zmiennej, jeśli nie masz jej wartości. Możesz także przypisać maksymalną wartość daty / godziny - w dowolny sposób, który Ci odpowiada. Upewnij się tylko, że sprawdzasz wartości daty / godziny w całej witrynie. Zdecyduj się na użycie
min
lubmax
i trzymaj się tego.Oznacz zmienną daty / godziny jako
nullable
. W ten sposób możesz ustawić zmienną daty / godziny na,null
jeśli nie masz do niej zmiennej.Pokażę pierwszy punkt na przykładzie. Typ
DateTime
zmiennej nie może być ustawiony na null, potrzebuje wartości, w tym przypadku ustawię ją naDateTime
minimalną wartość, jeśli nie ma żadnej wartości.Mój scenariusz jest taki, że mam
BlogPost
zajęcia. Ma wiele różnych pól / właściwości, ale w tym przykładzie wybrałem tylko dwa.DatePublished
jest, gdy post został opublikowany na stronie internetowej i musi zawierać wartość daty / godziny.DateModified
ma miejsce, gdy wpis jest modyfikowany, więc nie musi zawierać wartości, ale może zawierać wartość.Użycie
ADO.NET
do pobrania danych z bazy danych (przypisanieDateTime.MinValue
oznacza brak wartości):Mój drugi punkt możesz osiągnąć, zaznaczając
DateModified
pole jakonullable
. Teraz możesz ustawić go,null
jeśli nie ma dla niego żadnej wartości:Przy
ADO.NET
pobieraniu danych z bazy danych będzie wyglądać nieco inaczej niż powyżej (przypisywanienull
zamiastDateTime.MinValue
):Mam nadzieję, że pomoże to wyjaśnić wszelkie nieporozumienia. Biorąc pod uwagę, że moja odpowiedź jest około 8 lat później, prawdopodobnie jesteś już programistą C # :)
źródło