2013-04-04 10 views
5

Sono consapevole della procedura standard per la visualizzazione di un DateTime in un formato personalizzato, in questo modo:No DateTime? .ToString (stringa) sovraccarico?

MessageBox.Show(dateSent.ToString("dd/MM/yyyy hh:mm:ss"));

Tuttavia, quando cambio la variabile da un DateTime ad un DateTime? per accettare i valori nulli, perdo la definizione per il sovraccarico ToString(string). Ho bisogno di usare DateTime? mentre sto leggendo da un database che potenzialmente ha valori nulli - se il campo nel database ha un valore nullo, allora devo anche assegnare alla variabile un valore nullo.

Così ho due domande:

1) per curiosità, qualcuno sa se c'è un motivo per cui DateTime? non contiene un sovraccarico per ToString(string)?

2) Qualcuno potrebbe suggerire un metodo alternativo per quello che sto cercando di ottenere?

+4

Perché potrebbe essere nullo. Cos'è 'null.ToString()'? –

+1

'Perché potrebbe essere nullo. Non è una domanda retorica. Anche la domanda reale non è retorica. Se puoi dirmi che null.ToString() penso che sarebbe molto utile. –

+0

possibile duplicato di [Come posso formattare un DateTime nullable con ToString()?] (Http://stackoverflow.com/questions/1833054/how-can-i-format-a-nullable-datetime-with-tostring) –

risposta

10

DateTime? è zucchero sintattico per Nullable<DateTime> ed è per questo che non ha sovraccarico ToString(format).

Tuttavia, è possibile accedere alla struttura sottostante DateTime utilizzando la proprietà Value. Ma prima di usare HasValue per controllare, se il valore esiste.

MessageBox.Show(dateSent.HasValue ? dateSent.Value.ToString("dd/MM/yyyy hh:mm:ss") : string.Empty) 
+0

Apparentemente 'DateTime' non contiene una definizione per' HasValue'? –

+1

Ma "Datetime?" Sì, perché è stato trasformato da "Nullable " dal compilatore. – MarcinJuraszek

+0

Ahhh, capisco, sto iniziando a capire che ci sono alcune differenze tra 'DateTime' e' DateTime? '- grazie :) –

1

È comunque possibile utilizzare

variableName.Value.ToString(customFormat); 
+6

Ma solo se si è certi che la variabile non contenga nulla in quel punto. – KingCronus

+0

Sì, suppongo che la gente capisca cos'è un tipo nullable – GLlompart

+0

Sì, posso solo fare un 'if (nomeVariabile!= null) 'e questo metodo funziona altrettanto bene. Grazie per la soluzione! +1 –

6

Invece di dover eseguire manualmente un controllo nullo ogni volta, è possibile scrivere un metodo di estensione.

public static string ToStringFormat(this DateTime? dt, string format) 
{ 
     if(dt.HasValue) 
     return dt.Value.ToString(format); 
     else 
     return ""; 
} 

e usarlo in questo modo (con qualsiasi formato stringa che si desidera)

Console.WriteLine(myNullableDateTime.ToStringFormat("dd/MM/yyyy hh:mm:ss")); 
+0

Questo è la prima volta che ho riscontrato un metodo di estensione. È forse un po 'eccessivo per i miei bisogni (dato che questa situazione annullabile di datetime è un raro incontro nella mia applicazione) ma la tua risposta è elegante ed è stata un'esperienza di apprendimento per me. Grazie! +1 –

+0

@Teifi - Prego :) I metodi di estensione devono essere in una classe statica (ho creato una nuova classe statica che contiene numerosi metodi ext e li importa nei miei progetti). Per creare un metodo ext, deve essere statico e deve avere la parola 'this'. Il primo parametro è il tipo che sarà interessato (qui è 'DateTime?') Quindi ora, quando hai un oggetto 'DateTime?', Puoi premere '.' e elencherà i metodi usuali e quelli ext. Maggiori informazioni qui http://msdn.microsoft.com/en-gb/library/vstudio/bb383977.aspx Utile per azioni ripetute sui tipi. – keyboardP

Problemi correlati