Jak przekonwertować zerowalne DateTime dt2 na sformatowany ciąg?
DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss")); //works
DateTime? dt2 = DateTime.Now;
Console.WriteLine(dt2.ToString("yyyy-MM-dd hh:mm:ss")); //gives following error:
brak przeciążenia metody ToString wymaga jednego argumentu
c#
datetime
formatting
nullable
Edward Tanguay
źródło
źródło
Odpowiedzi:
EDYCJA: Jak stwierdzono w innych komentarzach, sprawdź, czy nie ma wartości zerowej.
Aktualizacja: zgodnie z zaleceniami w komentarzach, metoda rozszerzenia:
Począwszy od C # 6, możesz użyć operatora warunkowego null, aby jeszcze bardziej uprościć kod. Poniższe wyrażenie zwróci null, jeśli
DateTime?
null.źródło
Spróbuj tego dla rozmiaru:
Rzeczywisty obiekt dateTime, który chcesz sformatować, znajduje się we właściwości dt.Value, a nie w samym obiekcie dt2.
źródło
Wy wszyscy jesteście nad inżynierią i wszystko to sprawia, że jest to o wiele bardziej skomplikowane niż w rzeczywistości. Ważna rzecz: przestań używać ToString i zacznij korzystać z formatowania ciągów, takich jak string.Format lub metod, które obsługują formatowanie ciągów, takich jak Console.WriteLine. Oto preferowane rozwiązanie tego pytania. Jest to również najbezpieczniejsze.
Aktualizacja:
Aktualizuję przykłady za pomocą aktualnych metod dzisiejszego kompilatora C #. operatory warunkowe i interpolacja ciągów
Dane wyjściowe: (umieszczam w nim pojedyncze cudzysłowy, abyś mógł zobaczyć, że wraca jako pusty ciąg znaków, gdy jest pusty)
źródło
Jak stwierdzili inni, przed wywołaniem ToString należy sprawdzić wartość null, ale aby uniknąć powtarzania się, można utworzyć metodę rozszerzenia, która to robi, na przykład:
Które można wywołać jak:
źródło
Dziecko C # 6.0:
dt2?.ToString("dd/MM/yyyy");
źródło
Console.WriteLine(dt2?.ToString("yyyy-MM-dd hh:mm:ss" ?? "n/a");
Problem z sformułowaniem odpowiedzi na to pytanie polega na tym, że nie określa się żądanego wyniku, gdy zerowa data / godzina nie ma żadnej wartości. W
DateTime.MinValue
takim przypadku wyświetli się następujący kod, w przeciwieństwie do obecnie akceptowanej odpowiedzi, nie zgłosi wyjątku.źródło
Widząc, że naprawdę chcesz podać format, sugeruję dodanie interfejsu IFormattable do metody rozszerzenia Smalls w ten sposób, aby nie mieć nieprzyjemnego połączenia formatu łańcucha.
źródło
Co powiesz na coś tak prostego:
źródło
Możesz użyć
dt2.Value.ToString("format")
, ale oczywiście wymaga to, aby dt2! = Null, i to przede wszystkim neguje użycie typu zerowalnego.Jest tu kilka rozwiązań, ale najważniejsze pytanie brzmi: jak sformatować
null
datę?źródło
Oto bardziej ogólne podejście. Umożliwi to formatowanie dowolnego typu wartości dopuszczającej wartości zerowe. Podałem drugą metodę, aby umożliwić zastąpienie domyślnej wartości ciągu zamiast używania wartości domyślnej dla typu wartości.
źródło
Najkrótsza odpowiedź
Testy
źródło
Jeszcze lepsze rozwiązanie w C # 6.0:
źródło
Składnia RAZOR:
źródło
Myślę, że musisz użyć metody GetValueOrDefault-Methode. Zachowanie w przypadku ToString („yy ...”) nie jest zdefiniowane, jeśli instancja ma wartość NULL.
źródło
Oto doskonała odpowiedź Blake'a jako metody rozszerzenia. Dodaj to do swojego projektu, a wywołania w pytaniu będą działać zgodnie z oczekiwaniami.
Oznacza to, że używa się go
MyNullableDateTime.ToString("dd/MM/yyyy")
z tym samym wyjściem coMyDateTime.ToString("dd/MM/yyyy")
, z tym wyjątkiem, że wartość będzie miała wartość,"N/A"
jeśli DateTime ma wartość null.źródło
IFormattable zawiera również dostawcę formatu, którego można użyć, pozwala to, aby zarówno format IFormatProvider był zerowy w dotnet 4.0, byłoby to
używając razem z nazwanymi parametrami możesz:
dt2.ToString (defaultValue: „n / a”);
W starszych wersjach dotnet występuje wiele przeciążeń
źródło
Podoba mi się ta opcja:
źródło
Proste rozszerzenia ogólne
źródło
Może to późna odpowiedź, ale może pomóc każdemu innemu.
Proste jest:
lub po prostu użyj dowolnego formatu zamiast „d”.
Najlepsza
źródło
możesz użyć prostej linii:
źródło