Data vs DateTime


110

Sto lavorando a un programma che richiede la restituzione della data di un evento.

Sto cercando un Date, non un DateTime.

Esiste un tipo di dati che restituisce solo la data?

Risposte:


131

No non c'è. DateTimerappresenta un punto nel tempo che è composto da una data e un'ora. Tuttavia, è possibile recuperare la parte della data tramite la Dateproprietà (che è un'altra DateTimecon l'ora impostata su 00:00:00).

E si può recuperare le singole proprietà di data via Day, Monthe Year.


23

Ho creato una semplice struttura Date per le volte in cui hai bisogno di una data semplice senza preoccuparti della porzione di tempo, dei fusi orari, di local vs. utc, ecc.

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


2
Grazie! Questo è utile.
garfbradaz

16

Sfortunatamente, non in .Net BCL. Le date sono generalmente rappresentate come un oggetto DateTime con l'ora impostata su mezzanotte.

Come puoi immaginare, questo significa che hai tutti i problemi relativi al fuso orario intorno ad esso, anche se per un oggetto Date non vorresti assolutamente alcuna gestione del fuso orario.


1
Se utilizzi un valore DateTime come Date, imposta Kind su UTC. Nessun aggiustamento del fuso orario da affrontare. DateTime date = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc);
Suncat2000

Sì, posso parlare per esperienza che usare dateper qualsiasi cosa è una cattiva idea a meno che tu non sia sicuro al 100% che la tua app funzionerà solo in un fuso orario. Salvare tutto come datetimeti dà il meglio di entrambi i mondi, incluso il più critico, un modo semplice per evitare incubi di fuso orario se le configurazioni del fuso orario del tuo server cambiano ... e inizia a scrivere dati in modi che non avevi previsto. Datetimepuò salvarti lì, datenon può affatto, e diventerà incredibilmente difficile da sistemare se inizi a scrivere datecon il contesto del fuso orario sbagliato.
Kelsey Hannan

2
@KelseyHannan a meno che, naturalmente, tu non abbia a che fare con cose come "data di nascita" o "data di acquisto", in cui non vuoi esplicitamente che le cose cambino misteriosamente i giorni solo perché hai trasferito paesi. Ad esempio, l'elaborazione delle richieste di mutui irlandesi in Nuova Zelanda come esempio non casuale.
Roger Willcocks

9

Crea una classe wrapper. Qualcosa come questo:

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

Ed esponi quello valueche vuoi.


4
Suggerirei che il tuo costruttore dovrebbe impostare DateTime.Kind su in DateTimeKind.Unspecifiedmodo che quando serializzato venga deserializzato senza convertire (potrebbe cambiare la data in base a diversi fusi orari).
oatsoda

1
@OffHeGoes Imposta DateTime.Kind su DateTimeKind.Utc. Non impostarlo su DateTimeKind.Unspecifiedperché ciò garantirà che venga serializzato / deserializzato con un offset di fuso orario incluso! Una data del calendario è la stessa indipendentemente dal fuso orario, quindi non lasciare che il sistema la regoli.
Suncat2000


4

DateTime ha una proprietà Date che puoi usare per isolare la parte della data. Il metodo ToString fa anche un buon lavoro visualizzando solo la parte Date quando la parte time è vuota.


3

L'oggetto DateTime ha una proprietà che restituisce solo la parte relativa alla data del valore.

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

Questa risposta non è corretta. La data restituisce una DateTimecon l'ora impostata su 0:00:00
Serj Sagan

3

Non esiste alcun DateDataType.

Tuttavia puoi usare DateTime.Dateper ottenere solo la data.

PER ESEMPIO

DateTime date = DateTime.Now.Date;

Esiste una struttura Date e gli oggetti possono essere dichiarati come tipo Date.
Kaleb Anderson

@KalebAnderson non nell'implementazione predefinita .NET, non c'è. Se stai parlando di VB.net Date, questo è ancora un DateTime.
Nick N.

DateTime.Now.Dateè lo stesso di DateTime.Today. Esiste un DateTime.UtcNowche restituisce il valore data-ora come ora universale (UTC), ma non esiste un metodo o una proprietà equivalente a UTC per Today; DateTimeKind.UtcNow.Dateè l'espressione appropriata.
Suncat2000

2

Puoi restituire DateTime dove la parte dell'ora è 00:00:00 e ignorarla. Le date vengono gestite come numeri interi di timestamp, quindi ha senso combinare la data con l'ora in quanto è comunque presente nell'intero.


2

Per questo, è necessario utilizzare la data, ma ignorare il valore dell'ora.

Normalmente una data sarebbe un DateTime con ora di 00:00:00

Il DateTimetipo ha una .Dateproprietà che restituisce il DateTimecon il valore temporale impostato come sopra.


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

        set 
        { 
            TheDate = value; 
        } 
    }    
}

4
Sarebbe utile dare qualche spiegazione alla tua risposta.
Guanxi

0

Puoi provare uno dei seguenti:

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

Ma non esiste un tipo "Data" nel BCL.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.