¿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
c#
datetime
formatting
nullable
Edward Tanguay
fuente
fuente
Respuestas:
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:
Y a partir de C # 6, puede usar el operador condicional nulo para simplificar aún más el código. La siguiente expresión devolverá nulo si
DateTime?
es nulo.fuente
Probar esto para el tamaño:
El objeto dateTime real que desea formatear está en la propiedad dt.Value, y no en el objeto dt2 en sí.
fuente
Ustedes están sobre ingeniería todo esto y lo hacen mucho más complicado de lo que realmente es. Lo importante, deje de usar ToString y comience a usar el formato de cadena como string.Format o los métodos que admiten el formato de cadena como Console.WriteLine. Aquí está la solución preferida para esta pregunta. Este es también el más seguro.
Actualizar:
Actualizo los ejemplos con métodos actualizados del compilador de C # de hoy. operadores condicionales e interpolación de cadenas
Salida: (pongo comillas simples para que pueda ver que vuelve como una cadena vacía cuando es nulo)
fuente
Como otros han dicho, debe verificar si hay valores nulos antes de invocar ToString, pero para evitar repetirse, puede crear un método de extensión que haga eso, algo como:
Que se puede invocar como:
fuente
C # 6.0 bebé:
dt2?.ToString("dd/MM/yyyy");
fuente
Console.WriteLine(dt2?.ToString("yyyy-MM-dd hh:mm:ss" ?? "n/a");
El problema con la formulación de una respuesta a esta pregunta es que no especifica la salida deseada cuando la fecha y hora anulable no tiene valor. El siguiente código saldrá
DateTime.MinValue
en tal caso y, a diferencia de la respuesta actualmente aceptada, no arrojará una excepción.fuente
Al ver que realmente desea proporcionar el formato, le sugiero que agregue la interfaz IFormattable al método de extensión Smalls de esta manera, de esa manera no tiene la concatenación de formato de cadena desagradable.
fuente
¿Qué pasa con algo tan fácil como esto?
fuente
Puede usar
dt2.Value.ToString("format")
, pero, por supuesto, eso requiere que dt2! = Null, y eso niega el uso de un tipo anulable en primer lugar.Aquí hay varias soluciones, pero la gran pregunta es: ¿cómo desea formatear una
null
fecha?fuente
Aquí hay un enfoque más genérico. Esto le permitirá formatear en cadena cualquier tipo de valor anulable. He incluido el segundo método para permitir reemplazar el valor de cadena predeterminado en lugar de usar el valor predeterminado para el tipo de valor.
fuente
Respuesta más corta
Pruebas
fuente
Incluso una mejor solución en C # 6.0:
fuente
Sintaxis de RAZOR:
fuente
Creo que tienes que usar GetValueOrDefault-Methode. El comportamiento con ToString ("aa ...") no está definido si la instancia es nula.
fuente
Aquí está la excelente respuesta de Blake como método de extensión. Agregue esto a su proyecto y las llamadas en la pregunta funcionarán como se esperaba.
Lo que significa que se usa como
MyNullableDateTime.ToString("dd/MM/yyyy")
, con el mismo resultado queMyDateTime.ToString("dd/MM/yyyy")
, excepto que el valor será"N/A"
si DateTime es nulo.fuente
IFormattable también incluye un proveedor de formatos que se puede usar, permite que ambos formatos de IFormatProvider sean nulos en dotnet 4.0, esto sería
usando junto con parámetros con nombre que puedes hacer:
dt2.ToString (Valor predeterminado: "n / a");
En versiones anteriores de dotnet obtienes muchas sobrecargas
fuente
Me gusta esta opcion:
fuente
Extensiones genéricas simples
fuente
Tal vez sea una respuesta tardía, pero puede ayudar a cualquier otra persona.
Simple es:
o simplemente use cualquier formato en lugar de "d".
Mejor
fuente
puedes usar una línea simple:
fuente