¿Cómo puedo formatear un DateTime que acepta valores NULL con ToString()?
¿ Cómo puedo convertir el DateTime dt2 anulable en una cadena formateada?
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:
sin sobrecarga al método ToString toma un argumento
Console.WriteLine(dt2 != null ? dt2.Value.ToString("yyyy-MM-dd hh:mm:ss") : "n/a");
EDITAR: Como se indicó en otros comentarios, verifique que haya un valor no nulo.
Actualización: como se recomienda en los comentarios, método de extensión:
public static string ToString(this DateTime? dt, string format)
=> dt == null ? "n/a" : ((DateTime)dt).ToString(format);
Y a partir de C# 6, puede utilizar el operador condicional nulo para simplificar aún más el código. La siguiente expresión devolverá nulo si DateTime?
es nulo.
dt2?.ToString("yyyy-MM-dd hh:mm:ss")
Pruébate esto para ver el tamaño:
El objeto dateTime real que desea formatear está en la propiedad dt.Value y no en el objeto dt2 en sí.
DateTime? dt2 = DateTime.Now;
Console.WriteLine(dt2.HasValue ? dt2.Value.ToString("yyyy-MM-dd hh:mm:ss") : "[N/A]");
Ustedes están superando la ingeniería de todo esto y haciéndolo mucho más complicado de lo que realmente es. Lo importante es dejar de usar ToString y comenzar a usar formato de cadena como string.Format o métodos que admitan formato de cadena como Console.WriteLine. Aquí está la solución preferida a esta pregunta. Este también es el más seguro.
Actualizar:
Actualizo los ejemplos con métodos actualizados del compilador de C# actual. operadores condicionales e interpolación de cadenas
DateTime? dt1 = DateTime.Now;
DateTime? dt2 = null;
Console.WriteLine("'{0:yyyy-MM-dd hh:mm:ss}'", dt1);
Console.WriteLine("'{0:yyyy-MM-dd hh:mm:ss}'", dt2);
// New C# 6 conditional operators (makes using .ToString safer if you must use it)
// https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators
Console.WriteLine(dt1?.ToString("yyyy-MM-dd hh:mm:ss"));
Console.WriteLine(dt2?.ToString("yyyy-MM-dd hh:mm:ss"));
// New C# 6 string interpolation
// https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/interpolated
Console.WriteLine($"'{dt1:yyyy-MM-dd hh:mm:ss}'");
Console.WriteLine($"'{dt2:yyyy-MM-dd hh:mm:ss}'");
Salida: (Le puse comillas simples para que pueda ver que vuelve como una cadena vacía cuando es nulo)
'2019-04-09 08:01:39'
''
2019-04-09 08:01:39
'2019-04-09 08:01:39'
''
C# 6.0 bebé:
dt2?.ToString("dd/MM/yyyy");