Wie kann ich die nullfähige DateTime dt2 in eine formatierte Zeichenfolge konvertieren ?
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:
Keine Überladung der Methode ToString erfordert ein Argument
c#
datetime
formatting
nullable
Edward Tanguay
quelle
quelle
Antworten:
BEARBEITEN: Wie in anderen Kommentaren angegeben, überprüfen Sie, ob ein Wert ungleich Null vorhanden ist.
Update: wie in den Kommentaren empfohlen, Erweiterungsmethode:
Ab C # 6 können Sie den nullbedingten Operator verwenden , um den Code noch weiter zu vereinfachen. Der folgende Ausdruck gibt null zurück, wenn der
DateTime?
Wert null ist.quelle
Probieren Sie dies für die Größe an:
Das tatsächliche dateTime-Objekt, das Sie formatieren möchten, befindet sich in der Eigenschaft dt.Value und nicht im Objekt dt2.
quelle
Ihr seid damit fertig, das alles zu konstruieren und es viel komplizierter zu machen, als es wirklich ist. Wichtig ist, dass Sie ToString nicht mehr verwenden und die Formatierung von Zeichenfolgen wie string.Format oder Methoden, die die Formatierung von Zeichenfolgen unterstützen, wie Console.WriteLine verwenden. Hier ist die bevorzugte Lösung für diese Frage. Dies ist auch am sichersten.
Aktualisieren:
Ich aktualisiere die Beispiele mit aktuellen Methoden des heutigen C # -Compilers. Bedingte Operatoren & String-Interpolation
Ausgabe: (Ich habe einfache Anführungszeichen eingefügt, damit Sie sehen können, dass es als leere Zeichenfolge zurückkommt, wenn es null ist.)
quelle
Wie andere angegeben haben, müssen Sie vor dem Aufrufen von ToString nach null suchen. Um jedoch zu vermeiden, dass Sie sich wiederholen, können Sie eine Erweiterungsmethode erstellen, die dies tut, etwa:
Welches kann aufgerufen werden wie:
quelle
C # 6.0 Baby:
dt2?.ToString("dd/MM/yyyy");
quelle
Console.WriteLine(dt2?.ToString("yyyy-MM-dd hh:mm:ss" ?? "n/a");
Das Problem bei der Formulierung einer Antwort auf diese Frage besteht darin, dass Sie die gewünschte Ausgabe nicht angeben, wenn die nullfähige Datumszeit keinen Wert hat. Der folgende Code wird
DateTime.MinValue
in einem solchen Fall ausgegeben und löst im Gegensatz zur derzeit akzeptierten Antwort keine Ausnahme aus.quelle
Da Sie tatsächlich das Format bereitstellen möchten, würde ich vorschlagen, die IFormattable-Schnittstelle wie folgt zur Smalls-Erweiterungsmethode hinzuzufügen, damit Sie nicht die unangenehme Verkettung des Zeichenfolgenformats haben.
quelle
Was ist mit so etwas Einfachem:
quelle
Sie können verwenden
dt2.Value.ToString("format")
, aber das erfordert natürlich, dass dt2! = Null ist, und das negiert die Verwendung eines nullbaren Typs an erster Stelle.Hier gibt es mehrere Lösungen, aber die große Frage ist: Wie möchten Sie ein
null
Datum formatieren ?quelle
Hier ist ein allgemeinerer Ansatz. Auf diese Weise können Sie einen beliebigen nullbaren Werttyp formatieren. Ich habe die zweite Methode eingefügt, um das Überschreiben des Standardzeichenfolgenwerts zu ermöglichen, anstatt den Standardwert für den Werttyp zu verwenden.
quelle
Kürzeste Antwort
Tests
quelle
Noch eine bessere Lösung in C # 6.0:
quelle
RAZOR-Syntax:
quelle
Ich denke, Sie müssen die GetValueOrDefault-Methode verwenden. Das Verhalten mit ToString ("yy ...") ist nicht definiert, wenn die Instanz null ist.
quelle
Hier ist Blakes ausgezeichnete Antwort als Erweiterungsmethode. Fügen Sie dies Ihrem Projekt hinzu, und die Aufrufe in der Frage funktionieren wie erwartet. Dies bedeutet , dass
es wie
MyNullableDateTime.ToString("dd/MM/yyyy")
mit der gleichen Ausgabe wie verwendet wirdMyDateTime.ToString("dd/MM/yyyy")
, außer dass der Wert"N/A"
lautet , wenn DateTime null ist.quelle
IFormattable enthält auch einen Formatanbieter, der verwendet werden kann. Dadurch können beide Formate von IFormatProvider in Dotnet 4.0 null sein
zusammen mit benannten Parametern können Sie Folgendes tun:
dt2.ToString (defaultValue: "n / a");
In älteren Dotnet-Versionen kommt es zu vielen Überlastungen
quelle
Ich mag diese Option:
quelle
Einfache generische Erweiterungen
quelle
Vielleicht ist es eine späte Antwort, kann aber jedem anderen helfen.
Einfach ist:
oder verwenden Sie einfach ein beliebiges Format anstelle von "d".
Beste
quelle
Sie können einfache Linie verwenden:
quelle