Date vs DateTime

110

Ich arbeite an einem Programm, für dessen Rückgabe das Datum eines Ereignisses erforderlich ist.

Ich suche ein Date, kein DateTime.

Gibt es einen Datentyp, der nur das Datum zurückgibt?

MrM
quelle

Antworten:

131

Nein, gibt es nicht. DateTimestellt einen Zeitpunkt dar, der sich aus einem Datum und einer Uhrzeit zusammensetzt. Sie können den Datumsteil jedoch über die DateEigenschaft abrufen (eine andere DateTimemit der eingestellten Zeit 00:00:00).

Und Sie können über einzelne Datumseigenschaften abrufen Day, Monthund Year.

Ronald Wildenberg
quelle
23

Ich habe eine einfache Datumsstruktur für Zeiten erstellt, in denen Sie ein einfaches Datum benötigen, ohne sich um Zeitanteil, Zeitzonen, lokale oder utc usw. kümmern zu müssen.

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

Lehm
quelle
2
Vielen Dank! Das ist nützlich.
Garfbradaz
16

Leider nicht in der .Net BCL. Daten werden normalerweise als DateTime-Objekt dargestellt, wobei die Zeit auf Mitternacht festgelegt ist.

Wie Sie sich vorstellen können, bedeutet dies, dass Sie alle damit verbundenen Zeitzonenprobleme haben, obwohl Sie für ein Datumsobjekt absolut keine Zeitzonenbehandlung wünschen.

Jonathan Rupp
quelle
1
Wenn Sie einen DateTime-Wert als Datum verwenden, setzen Sie die Art auf UTC. Keine Zeitzonenanpassungen. DateTime date = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc);
Suncat2000
Ja, ich kann aus Erfahrung sagen, dass die Verwendung datefür alles eine schlechte Idee ist, es sei denn, Sie sind zu 100% sicher, dass Ihre App immer nur in einer Zeitzone funktioniert. Speichern alles datetimebietet Ihnen das Beste aus beiden Welten, der Kritik am meisten darunter, eine einfache Möglichkeit zu vermeiden Zeitzone Alpträume , wenn der Server die Zeitzone configs jemals ändern ... und beginnt das Schreiben von Daten in einer Weise , Sie nicht zu antizipieren. Datetimekann Sie dort retten, kann es dateüberhaupt nicht und wird unglaublich schwer zu reparieren sein, wenn Sie jemals anfangen date, mit dem falschen Zeitzonenkontext aufzuschreiben.
Kelsey Hannan
2
@KelseyHannan, es sei denn, Sie haben es natürlich mit Dingen wie "Geburtsdatum" oder "Kaufdatum" zu tun, bei denen Sie ausdrücklich nicht möchten, dass sich die Tage auf mysteriöse Weise ändern, nur weil Sie in ein anderes Land gezogen sind. Wie zum Beispiel die Bearbeitung irischer Hypothekenanträge in Neuseeland als nicht zufälliges Beispiel.
Roger Willcocks
9

Erstellen Sie eine Wrapper-Klasse. Etwas wie das:

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;
    }

Und entlarven valueSie , was immer Sie wollen.

Øyvind Skaar
quelle
4
Ich würde vorschlagen, dass Ihr Konstruktor DateTime.Kind auf DateTimeKind.Unspecifiedso setzt, dass es bei der Serialisierung ohne Konvertierung deserialisiert wird (das Datum kann sich je nach Zeitzone ändern).
Oatsoda
1
@OffHeGoes Setzen Sie DateTime.Kind auf DateTimeKind.Utc. Stellen Sie es nicht auf ein, DateTimeKind.Unspecifiedda dies garantiert, dass es mit einem enthaltenen Zeitzonenversatz serialisiert / deserialisiert wird! Ein Kalenderdatum ist unabhängig von der Zeitzone gleich. Lassen Sie es daher nicht vom System anpassen.
Suncat2000
5

Der Datumstyp ist nur ein Alias ​​des von VB.NET verwendeten DateTime-Typs (wie int zu Integer wird). Beide Typen verfügen über eine Date-Eigenschaft, die Ihnen das Objekt mit dem auf 00:00:00 festgelegten Zeitteil zurückgibt.

stevehipwell
quelle
1
Wahr. Die MSDN-Dokumentseite für den VB.NET-Datumstyp lautet: Der entsprechende Typ in .NET Framework ist die System.DateTime- Struktur.
Miroxlav
4

DateTime verfügt über eine Date- Eigenschaft, mit der Sie den Datumsteil isolieren können. Die ToString- Methode leistet auch gute Arbeit darin, den Datumsteil nur anzuzeigen, wenn der Zeitteil leer ist.

Kreuz
quelle
3

Das DateTime-Objekt verfügt über eine Eigenschaft, die nur den Datumsteil des Werts zurückgibt.

    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
quelle
Diese Antwort ist falsch. Das Datum gibt ein DateTimemit der auf 0:00:00
Serj Sagan
3

Es gibt keinen DateDatentyp.

Sie können DateTime.Datejedoch nur das Datum abrufen.

Z.B

DateTime date = DateTime.Now.Date;
Nick N.
quelle
Es gibt eine Datumsstruktur, und Objekte können als Typ Datum deklariert werden.
Kaleb Anderson
@KalebAnderson nicht in der Standardimplementierung .NET, gibt es nicht. Wenn Sie über das VB.net-Datum sprechen, ist dies immer noch eine DateTime.
Nick N.
DateTime.Now.Dateist das gleiche wie DateTime.Today. Es gibt eine DateTime.UtcNow, die den Datums- / Uhrzeitwert als Weltzeit (UTC) zurückgibt, aber es gibt keine UTC-äquivalente Methode oder Eigenschaft für Heute. DateTimeKind.UtcNow.Dateist der passende Ausdruck.
Suncat2000
2

Sie können DateTime zurückgeben, wobei der Zeitabschnitt 00:00:00 ist, und ihn einfach ignorieren. Die Datumsangaben werden als Zeitstempel-Ganzzahlen behandelt, daher ist es sinnvoll, das Datum mit der Uhrzeit zu kombinieren, da diese ohnehin in der Ganzzahl vorhanden ist.

Mikko Rantanen
quelle
2

Dazu müssen Sie das Datum verwenden, den Zeitwert jedoch ignorieren.

Normalerweise ist ein Datum eine DateTime mit der Uhrzeit von 00:00:00

Der DateTimeTyp hat eine .DateEigenschaft, die den DateTimemit dem oben festgelegten Zeitwert zurückgibt .

Sam Meldrum
quelle
1
public class AsOfdates
{
    public string DisplayDate { get; set; }
    private DateTime TheDate;
    public DateTime DateValue 
    {
        get 
        { 
            return TheDate.Date; 
        } 

        set 
        { 
            TheDate = value; 
        } 
    }    
}
William Mendoza
quelle
4
Eine Erklärung zu Ihrer Antwort wäre hilfreich.
Guanxi
0

Sie können eine der folgenden Möglichkeiten ausprobieren:

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

Es gibt jedoch keinen "Datum" -Typ in der BCL.

Andrew Hare
quelle