Pracuję nad programem, który wymaga zwrócenia daty wydarzenia.
Szukam, a Date
nie DateTime
.
Czy istnieje typ danych, który zwraca tylko datę?
Nie, nie ma. DateTime
reprezentuje pewien punkt w czasie, który składa się z daty i godziny. Możesz jednak pobrać część daty za pośrednictwem Date
właściwości (czyli innej DateTime
z ustawionym czasem 00:00:00
).
I można odzyskać poprzez indywidualne właściwości date Day
, Month
i Year
.
Stworzyłem prostą strukturę Date dla czasów, kiedy potrzebujesz prostej daty bez martwienia się o część czasową, strefy czasowe, lokalną i utc itp.
Date today = Date.Today;
Date yesterday = Date.Today.AddDays(-1);
Date independenceDay = Date.Parse("2013-07-04");
independenceDay.ToLongString(); // "Thursday, July 4, 2013"
independenceDay.ToShortString(); // "7/4/2013"
independenceDay.ToString(); // "7/4/2013"
independenceDay.ToString("s"); // "2013-07-04"
int july = independenceDay.Month; // 7
Niestety nie w .Net BCL. Daty są zwykle reprezentowane jako obiekt DateTime z czasem ustawionym na północ.
Jak możesz się domyślić, oznacza to, że masz wszystkie związane z nią problemy ze strefą czasową, nawet jeśli w przypadku obiektu Date nie chcesz absolutnie żadnej obsługi strefy czasowej.
źródło
date
do czegokolwiek to zły pomysł, chyba że masz 100% pewności, że Twoja aplikacja będzie działać tylko w jednej strefie czasowej. Zapisanie wszystkiego, codatetime
daje ci to, co najlepsze z obu światów, w tym co najważniejsze, łatwy sposób na uniknięcie koszmarów związanych ze strefą czasową, jeśli konfiguracja strefy czasowej twojego serwera kiedykolwiek się zmieni ... i zacznie zapisywać dane w sposób, którego się nie spodziewałeś.Datetime
może cię tam uratować,date
w ogóle nie może, i stanie się niezwykle trudna do naprawienia, jeśli kiedykolwiek zaczniesz pisaćdate
w złym kontekście strefy czasowej.Utwórz klasę opakowania. Coś takiego:
I ujawniaj, co
value
chcesz.źródło
DateTimeKind.Unspecified
tak, aby po serializacji został zdeserializowany bez konwersji (może zmienić datę na podstawie różnych stref czasowych).DateTimeKind.Utc
. Nie ustawiaj go na,DateTimeKind.Unspecified
ponieważ zagwarantuje to, że zostanie serializowany / deserializowany z dołączonym przesunięciem strefy czasowej! Data w kalendarzu jest taka sama niezależnie od strefy czasowej, więc nie pozwól, aby system ją dostosował.Typ Date to po prostu alias typu DateTime używanego przez VB.NET (podobnie jak int zmienia się w Integer). Oba te typy mają właściwość Date, która zwraca obiekt z częścią czasu ustawioną na 00:00:00.
źródło
DateTime ma właściwość Date , której można użyć do wyodrębnienia części daty. Metoda ToString również dobrze się sprawdza, wyświetlając tylko część Date, gdy część czasu jest pusta.
źródło
Obiekt DateTime ma Właściwość, która zwraca tylko część wartości związaną z datą.
źródło
DateTime
z czasem ustawionym na 0:00:00Nie ma
Date
DataType.Możesz jednak użyć
DateTime.Date
tylko daty.NA PRZYKŁAD
źródło
DateTime.Now.Date
jest taki sam jakDateTime.Today
. IstniejeDateTime.UtcNow
funkcja, która zwraca wartość daty i godziny jako czas uniwersalny (UTC), ale nie ma równoważnej metody ani właściwości UTC dla Dzisiaj;DateTimeKind.UtcNow.Date
jest odpowiednim wyrażeniem.Możesz zwrócić DateTime, gdzie część czasu to 00:00:00 i po prostu ją zignorować. Daty są traktowane jako liczby całkowite ze znacznikiem czasu, więc sensowne jest łączenie daty z godziną, która i tak występuje w liczbie całkowitej.
źródło
W tym celu musisz użyć daty, ale zignoruj wartość czasu.
Zwykle data byłaby DateTime z czasem
00:00:00
DateTime
Typu ma.Date
właściwość, która zwracaDateTime
się z zestawu wartości czasu jak wyżej.źródło
źródło
Możesz spróbować jednego z poniższych:
Ale w BCL nie ma typu „Data”.
źródło