¿Cómo puedo formatear un DateTime que acepta valores NULL con ToString()?

Resuelto Edward Tanguay asked hace 15 años • 21 respuestas

¿ 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

Edward Tanguay avatar Dec 02 '09 20:12 Edward Tanguay
Aceptado
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")
Blake Pettersson avatar Dec 02 '2009 13:12 Blake Pettersson

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]");
Russ avatar Dec 02 '2009 14:12 Russ

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'
''
John C avatar Jan 22 '2014 15:01 John C

C# 6.0 bebé:

dt2?.ToString("dd/MM/yyyy");

iuliu.net avatar Jan 29 '2016 10:01 iuliu.net