Una delle prime cose che ho imparato su date e ore in c # (e varie altre lingue) è che una data viene memorizzata come DateTime con il componente orario impostato a mezzanotte. Non c'è differenza tra "1 gen 2017" e "1 gennaio 2017 00: 00: 00.000". Se è necessario visualizzare solo una data, è possibile utilizzare le funzioni di formattazione come ToString
per rimuovere la porzione di tempo.
Questo sembra causare molti problemi, alcuni dei quali li elencherò qui:
-
DateTime occupa più spazio di archiviazione del necessario: 8 byte invece del 3 richiesto per una data semplice.
-
L'uso di 00:00:00 per "nessuna data" confonde "un valore noto di 0" con "valore sconosciuto". Questo sembra piuttosto noobish, allo stesso modo un nuovo programmatore potrebbe confondere una stringa nulla con una stringa vuota. Null e empty sono diversi, e "no time" e "midnight" sono idee diverse.
-
Vedi idiomi come questo che appaiono, anche in comparazioni relativamente semplici:
if (startDate >= myDateTime && myDateTime < endDate.AddDays(1))
o
if (startDateTime >= myDate && myDate <= endDateTime.Date)
invece di molto più semplice
if (startDate >= myDate && myDate <= endDate)
-
Quando i componenti di sistema situati in fusi orari diversi si richiamano sui servizi Web e lo schema per tali servizi Web viene generato dai tipi c #, è possibile introdurre un elemento temporale (in modo che la data risultante si verifichi all'inizio del mattina), o il valore della data può effettivamente spostarsi di un giorno (ad esempio la data finale è in realtà il giorno precedente in un momento in tarda serata). Ciò può rendere doloroso trasmettere valori che sono agnostici rispetto al fuso orario, ad es. una data di nascita o una data di scadenza della carta di credito.
SQL Server ha un tipo Date
che memorizza solo mese, giorno e anno.
XSD specifica diversi tipi di dati per data, ora e data.
Perché c # non ha questo tipo?
Come lavori intorno ad esso? Ad esempio, è possibile attribuire le proprietà c # in modo che vengano serializzate come Data anziché come DateTime?