Como posso converter o DateTime dt2 anulável em uma seqüência de caracteres formatada?
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:
nenhuma sobrecarga para o método ToString leva um argumento
c#
datetime
formatting
nullable
Edward Tanguay
fonte
fonte
Respostas:
EDIT: Como declarado em outros comentários, verifique se existe um valor não nulo.
Atualização: conforme recomendado nos comentários, método de extensão:
E a partir do C # 6, você pode usar o operador nulo-condicional para simplificar ainda mais o código. A expressão abaixo retornará nulo se
DateTime?
for nulo.fonte
Tente isso para obter o tamanho:
O objeto dateTime real que você deseja formatar está na propriedade dt.Value, e não no próprio objeto dt2.
fonte
Vocês estão planejando tudo isso e tornando tudo muito mais complicado do que realmente é. Importante, pare de usar o ToString e comece a usar a formatação de string como string.Format ou métodos que suportam a formatação de string como Console.WriteLine. Aqui está a solução preferida para esta pergunta. Este também é o mais seguro.
Atualizar:
Eu atualizo os exemplos com métodos atualizados do compilador C # de hoje. operadores condicionais e interpolação de strings
Saída: (coloquei aspas simples para que você veja que ele volta como uma string vazia quando nulo)
fonte
Como outros já declararam, é necessário verificar se há nulo antes de chamar o ToString, mas para evitar se repetir, você pode criar um método de extensão que faça isso, algo como:
Que pode ser invocado como:
fonte
Bebê C # 6.0:
dt2?.ToString("dd/MM/yyyy");
fonte
Console.WriteLine(dt2?.ToString("yyyy-MM-dd hh:mm:ss" ?? "n/a");
O problema com a formulação de uma resposta para esta pergunta é que você não especifica a saída desejada quando o data / hora anulável não tem valor. O código a seguir será exibido
DateTime.MinValue
nesse caso e, diferentemente da resposta atualmente aceita, não emitirá uma exceção.fonte
Visto que você realmente deseja fornecer o formato, sugiro adicionar a interface IFormattable ao método de extensão Smalls dessa maneira, para que você não tenha a concatenação desagradável do formato de string.
fonte
Que tal algo tão fácil como isto:
fonte
Você pode usar
dt2.Value.ToString("format")
, mas é claro que isso exige que dt2! = Null, e que negue o uso de um tipo anulável em primeiro lugar.Existem várias soluções aqui, mas a grande questão é: como você deseja formatar uma
null
data?fonte
Aqui está uma abordagem mais genérica. Isso permitirá que você formate uma string com qualquer tipo de valor anulável. Eu incluí o segundo método para permitir substituir o valor padrão da string em vez de usar o valor padrão para o tipo de valor.
fonte
Resposta mais curta
Testes
fonte
Mesmo uma solução melhor no C # 6.0:
fonte
Sintaxe RAZOR:
fonte
Eu acho que você tem que usar o GetValueOrDefault-Methode. O comportamento com ToString ("yy ...") não é definido se a instância for nula.
fonte
Aqui está a excelente resposta de Blake como método de extensão. Adicione isso ao seu projeto e as chamadas na pergunta funcionarão conforme o esperado.
Significando que é usado como
MyNullableDateTime.ToString("dd/MM/yyyy")
, com a mesma saída queMyDateTime.ToString("dd/MM/yyyy")
, exceto que o valor será"N/A"
se o DateTime for nulo.fonte
O IFormattable também inclui um provedor de formatos que pode ser usado, pois permite que ambos os formatos do IFormatProvider sejam nulos no dotnet 4.0.
usando junto com parâmetros nomeados, você pode:
dt2.ToString (defaultValue: "n / a");
Nas versões mais antigas do dotnet, você recebe muitas sobrecargas
fonte
Eu gosto desta opção:
fonte
Extensões genéricas simples
fonte
Talvez seja uma resposta tardia, mas possa ajudar qualquer outra pessoa.
Simples é:
ou apenas use qualquer formato em vez de "d".
Melhor
fonte
você pode usar uma linha simples:
fonte