2013-04-04 12 views
5

Jestem świadomy standardowej procedury wyświetlania DateTime w formacie niestandardowym, tak:Brak przeciążenia DateTime? .ToString (ciąg)?

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

Jednak, kiedy zmienić zmienną z DateTime Do DateTime? zaakceptować wartości null, tracę definicja przeciążenia ToString(string). Muszę użyć DateTime?, ponieważ czytam z bazy danych, która potencjalnie ma wartości puste - jeśli pole w bazie danych ma wartość pustą, to muszę również przypisać zmienną wartość zerową.

Mam więc dwa pytania:

1) z ciekawości, czy ktoś wie, czy istnieje powód, dlaczego DateTime? nie zawiera przeciążenie dla ToString(string)?

2) Czy ktoś mógłby zaproponować alternatywną metodę dla tego, co próbuję osiągnąć?

+4

ponieważ może ona być zerowa. Czym jest 'null.ToString()'? –

+1

'Ponieważ może to być pusty \" nie jest retoryczne pytanie. Rzeczywiste pytanie też nie jest retoryczne. Jeśli możesz mi powiedzieć, co null.ToString() myślę, że byłoby to bardzo pomocne. –

+0

możliwy duplikat [Jak mogę sformatować zerowalną wartość DateTime za pomocą ToString()?] (Http://stackoverflow.com/questions/1833054/how-can-i-format-a-nullable-datetime-with-tostring) –

Odpowiedz

10

DateTime? to cukier syntaktyczny dla Nullable<DateTime> i dlatego nie ma przeciążenia ToString(format).

Można jednak uzyskać dostęp do podstawowej struktury DateTime przy użyciu właściwości Value. Ale przed tym użyj HasValue, aby sprawdzić, czy wartość istnieje.

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

Podobno 'DateTime' nie zawiera definicji' HasValue'? –

+1

Ale 'Datetime?' Ma, ponieważ został przekształcony 'Nullable ' przez kompilator. – MarcinJuraszek

+0

Ahhh, Rozumiem, zaczynam się uczyć, że istnieje sporo różnic między 'DateTime' i' DateTime? '- dzięki :) –

1

Można nadal używać

variableName.Value.ToString(customFormat); 
+6

Ale tylko wtedy, gdy masz pewność, że zmienna nie zawiera wartości zerowej w tym punkcie. – KingCronus

+0

No cóż, założyłem, że ludzie rozumieją, co jest typu zerowego. – GLlompart

+0

Tak, mogę po prostu zrobić 'if (variableName!= null) 'i ta metoda działa równie dobrze. Dziękujemy za obejście problemu! +1 –

6

Zamiast ręcznie wykonać null sprawdzić za każdym razem, można napisać metodę rozszerzenia.

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

i używać go w ten sposób (z niezależnie ciąg formatu chcesz)

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

To jest pierwszy raz spotkałem metodę rozszerzenia. To może trochę przesada dla moich potrzeb (ponieważ ta zerowa sytuacja datetime jest rzadkim spotkaniem w mojej aplikacji), ale twoja odpowiedź jest elegancka i była dla mnie doświadczeniem edukacyjnym. Dzięki! +1 –

+0

@Teifi - Nie ma za co :) Metody rozszerzeń muszą być w klasie statycznej (stworzyłem nową klasę statyczną, która zawiera wiele metod ext i zaimportuje je do moich projektów). Aby utworzyć metodę ext, musi być statyczna i musi zawierać słowo "this". Pierwszy parametr to typ, który zostanie zmieniony (tutaj jest 'DateTime?') Więc teraz, kiedy masz obiekt 'DateTime?', Możesz nacisnąć '.' i wyświetli on zarówno zwykłe metody, jak i ext. Więcej informacji tutaj http://msdn.microsoft.com/en-gb/library/vstudio/bb383977.aspx Przydatny przy powtarzających się akcjach na typach. – keyboardP

Powiązane problemy