Date vs DateTime

110

Pracuję nad programem, który wymaga zwrócenia daty wydarzenia.

Szukam, a Datenie DateTime.

Czy istnieje typ danych, który zwraca tylko datę?

MrM
źródło

Odpowiedzi:

131

Nie, nie ma. DateTimereprezentuje pewien punkt w czasie, który składa się z daty i godziny. Możesz jednak pobrać część daty za pośrednictwem Datewłaściwości (czyli innej DateTimez ustawionym czasem 00:00:00).

I można odzyskać poprzez indywidualne właściwości date Day, Monthi Year.

Ronald Wildenberg
źródło
23

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

https://github.com/claycephus/csharp-date

Glina
źródło
2
Dzięki! To jest przydatne.
garfbradaz
16

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.

Jonathan Rupp
źródło
1
Jeśli używasz wartości DateTime jako Date, ustaw Kind na UTC. Brak konieczności zmiany strefy czasowej. DateTime date = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc);
Suncat2000
Tak, z doświadczenia mogę powiedzieć, że używanie datedo 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, co datetimedaje 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ś. Datetimemoże cię tam uratować, datew ogóle nie może, i stanie się niezwykle trudna do naprawienia, jeśli kiedykolwiek zaczniesz pisać datew złym kontekście strefy czasowej.
Kelsey Hannan
2
@KelseyHannan, chyba że masz do czynienia z takimi rzeczami, jak „data urodzenia” lub „data zakupu”, w przypadku których wyraźnie nie chcesz, aby dni zmieniały się w tajemniczy sposób tylko dlatego, że przeniosłeś się do innych krajów. Powiedzmy, że przetwarzanie irlandzkich wniosków o kredyt hipoteczny w Nowej Zelandii jest nieprzypadkowym przykładem.
Roger Willcocks
9

Utwórz klasę opakowania. Coś takiego:

public class Date:IEquatable<Date>,IEquatable<DateTime>
    {
        public Date(DateTime date)
        {
            value = date.Date;
        }

        public bool Equals(Date other)
        {
            return other != null && value.Equals(other.value);
        }

        public bool Equals(DateTime other)
        {
            return value.Equals(other);
        }

        public override string ToString()
        {
            return value.ToString();
        }
        public static implicit operator DateTime(Date date)
        {
            return date.value;
        }
        public static explicit operator Date(DateTime dateTime)
        {
            return new Date(dateTime);
        }

        private DateTime value;
    }

I ujawniaj, co valuechcesz.

Øyvind Skaar
źródło
4
Sugeruję, aby Twój konstruktor ustawił DateTime.Kind na DateTimeKind.Unspecifiedtak, aby po serializacji został zdeserializowany bez konwersji (może zmienić datę na podstawie różnych stref czasowych).
oatsoda
1
@OffHeGoes Ustaw DateTime.Kind na DateTimeKind.Utc. Nie ustawiaj go na, DateTimeKind.Unspecifiedponieważ 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ł.
Suncat2000
5

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.

stevehipwell
źródło
1
Prawdziwe. Strona dokumentacji MSDN dla VB.NET Date type mówi: Odpowiednim typem w .NET Framework jest struktura System.DateTime .
miroxlav
4

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.

Krzyż
źródło
3

Obiekt DateTime ma Właściwość, która zwraca tylko część wartości związaną z datą.

    public static void Main()
{
    System.DateTime _Now = DateAndTime.Now;
    Console.WriteLine("The Date and Time is " + _Now);
    //will return the date and time
    Console.WriteLine("The Date Only is " + _Now.Date);
    //will return only the date
    Console.Write("Press any key to continue . . . ");
    Console.ReadKey(true);
}
hmcclungiii
źródło
Ta odpowiedź jest nieprawidłowa. Date zwraca a DateTimez czasem ustawionym na 0:00:00
Serj Sagan
3

Nie ma DateDataType.

Możesz jednak użyć DateTime.Datetylko daty.

NA PRZYKŁAD

DateTime date = DateTime.Now.Date;
Nick N.
źródło
Istnieje struktura Date, a obiekty można zadeklarować jako typ Date.
Kaleb Anderson
@KalebAnderson nie jest w domyślnej implementacji .NET, nie ma. Jeśli mówisz o VB.net Date, to nadal jest to DateTime.
Nick N.
DateTime.Now.Datejest taki sam jak DateTime.Today. Istnieje DateTime.UtcNowfunkcja, 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.Datejest odpowiednim wyrażeniem.
Suncat2000
2

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.

Mikko Rantanen
źródło
2

W tym celu musisz użyć daty, ale zignoruj ​​wartość czasu.

Zwykle data byłaby DateTime z czasem 00:00:00

DateTimeTypu ma .Datewłaściwość, która zwraca DateTimesię z zestawu wartości czasu jak wyżej.

Sam Meldrum
źródło
1
public class AsOfdates
{
    public string DisplayDate { get; set; }
    private DateTime TheDate;
    public DateTime DateValue 
    {
        get 
        { 
            return TheDate.Date; 
        } 

        set 
        { 
            TheDate = value; 
        } 
    }    
}
William Mendoza
źródło
4
Pomocne byłoby wyjaśnienie odpowiedzi.
Guanxi
0

Możesz spróbować jednego z poniższych:

DateTime.Now.ToLongDateString();
DateTime.Now.ToShortDateString();

Ale w BCL nie ma typu „Data”.

Andrew Hare
źródło