Eu tenho data e hora em uma string formatada como essa:
"2011-03-21 13:26" //year-month-day hour:minute
Como posso analisá-lo System.DateTime
?
Desejo usar funções como DateTime.Parse()
ou, DateTime.ParseExact()
se possível, para poder especificar o formato da data manualmente.
Respostas:
DateTime.Parse()
tentará descobrir o formato da data especificada e geralmente faz um bom trabalho. Se você pode garantir que as datas sempre estejam em um determinado formato, poderá usarParseExact()
:(Mas observe que geralmente é mais seguro usar um dos métodos TryParse, caso uma data não esteja no formato esperado)
Certifique-se de verificar seqüências de caracteres de formato de data e hora personalizadas ao construir uma sequência de formato, especialmente preste atenção ao número de letras e letras maiúsculas e minúsculas (por exemplo, "MM" e "mm" significam coisas muito diferentes).
Outro recurso útil para seqüências de caracteres de formato C # é a Formatação de String em C #
fonte
s
. Portanto, é melhor usar o TryParseExcact. Eu indiquei o porquê na minha resposta abaixo.Como explicarei mais adiante, sempre favoreceria os métodos
TryParse
eTryParseExact
. Como eles são um pouco volumosos de usar, escrevi um método de extensão que facilita muito a análise:Diferente de etc.
Parse
,ParseExact
ele não gera uma exceção e permite que você verifique viaif (dt.HasValue) { // continue processing } else { // do error handling }
se a conversão foi bem-sucedida (neste caso,
dt
tem um valor que você pode acessar viadt.Value
) ou não (nesse caso, énull
).Isso ainda permite usar atalhos elegantes como o operador "Elvis"
?.
, por exemplo:Aqui você também pode usar
year.HasValue
para verificar se a conversão foi bem-sucedida e, se não for bem-sucedida,year
conteránull
, caso contrário, a parte do ano da data. Não há exceção lançada se a conversão falhar.Solução: O método de extensão .ToDate ()
Experimente .NetFiddle
Algumas informações sobre o código
Você pode se perguntar por que usei a
InvariantCulture
chamadaTryParseExact
: Isso é forçar a função a tratar os padrões de formato sempre da mesma maneira (caso contrário, por exemplo "." Pode ser interpretado como separador decimal em inglês enquanto é um separador de grupo ou um separador de data em Alemão). Lembre-se de que já consultamos as strings de formato baseadas em cultura algumas linhas antes, então tudo bem aqui.Atualização:
.ToDate()
(sem parâmetros) agora assume como padrão todos os padrões de data / hora comuns da cultura atual do encadeamento.Observe que precisamos do
result
edt
juntos, porqueTryParseExact
não permite o usoDateTime?
, que pretendemos retornar. No C # versão 7, você poderia simplificar aToDate
função um pouco da seguinte maneira:ou, se você gosta ainda mais:
nesse caso, você não precisa das duas declarações
DateTime? result = null;
eDateTime dt;
pode fazê-lo em uma linha de código. (Também seria permitido escrever emout DateTime dt
vez de,out var dt
se você preferir).Eu simplificaram o código ainda mais usando a
params
palavra-chave: Agora você não precisa do 2 nd método sobrecarregado mais.Exemplo de uso
Como você pode ver, este exemplo apenas consulta
dt.HasValue
para ver se a conversão foi bem-sucedida ou não. Como um bônus extra, o TryParseExact permite especificar strictDateTimeStyles
para que você saiba exatamente se uma sequência de data / hora adequada foi passada ou não.Mais exemplos de uso
A função sobrecarregada permite passar uma matriz de formatos válidos usados para analisar / converter datas, como mostrado aqui também (
TryParseExact
suporta diretamente isso), por exemploSe você tiver apenas alguns padrões de modelo, também poderá escrever:
Exemplos avançados
Você pode usar o
??
operador para usar como padrão um formato à prova de falhas, por exemploNesse caso, o
.ToDate()
usaria formatos comuns de data da cultura local e, se tudo isso falhar, tentaria usar o formato padrão ISO"yyyy-MM-dd HH:mm:ss"
como substituto. Dessa forma, a função de extensão permite "encadear" diferentes formatos de fallback facilmente.Você pode até usar a extensão no LINQ, tente isso (está no .NetFiddle acima):
que converterá as datas na matriz rapidamente, usando os padrões e despejando-os no console.
Alguns antecedentes sobre o TryParseExact
Finalmente, aqui estão alguns comentários sobre o plano de fundo (ou seja, a razão pela qual escrevi dessa maneira):
Estou preferindo o TryParseExact neste método de extensão, porque você evita o tratamento de exceções - você pode ler no artigo de Eric Lippert sobre exceções por que você deve usar o TryParse em vez de Parse, cito-o sobre esse tópico: 2)
Sim, mas
TryParse
eTryParseExact
ambos ainda são muito menos confortáveis de usar: Eles forçam você a usar uma variável não inicializada como umout
parâmetro que não deve ser anulável e, enquanto você está convertendo, precisa avaliar o valor de retorno booleano - ou você para usar umaif
instrução imediatamente ou você deve armazenar o valor de retorno em uma variável booleana adicional para poder fazer a verificação posteriormente. E você não pode simplesmente usar a variável de destino sem saber se a conversão foi bem-sucedida ou não.Na maioria dos casos, você só quer saber se a conversão foi bem-sucedida ou não (e, é claro, o valor, se foi bem-sucedida) ; portanto, uma variável de destino anulável que mantém todas as informações seria desejável e muito mais elegante - porque toda a informação é apenas armazenado em um local: isso é consistente, fácil de usar e muito menos propenso a erros.
O método de extensão que escrevi faz exatamente isso (também mostra que tipo de código você precisaria escrever toda vez que não quiser usá-lo).
Acredito que o benefício
.ToDate(strDateFormat)
é que parece simples e limpo - tão simples quanto o originalDateTime.Parse
deveria ser -, mas com a capacidade de verificar se a conversão foi bem-sucedida e sem gerar exceções.1) O que se entende aqui é que o tratamento de exceções (ou seja, um
try { ... } catch(Exception ex) { ...}
bloco) - necessário quando você estiver usando o Parse, porque emitirá uma exceção se uma sequência inválida for analisada - não é apenas desnecessário nesse caso, mas também irritante e complicando seu código. O TryParse evita tudo isso, pois o exemplo de código que forneci está sendo exibido.2) Eric Lippert é um famoso colega do StackOverflow e trabalha na Microsoft como desenvolvedor principal na equipe do compilador C # há alguns anos.
fonte
Confira este link para outras strings de formato!
fonte
DateTime.Parse () deve funcionar bem para esse formato de string. Referência:
http://msdn.microsoft.com/en-us/library/1k1skd40.aspx#Y1240
Está lançando uma FormatException para você?
fonte
Coloque o valor de uma sequência legível por humanos em um .NET DateTime com código como este:
fonte
A resposta simples e direta ->
fonte
Você também pode usar XmlConvert.ToDateString
É bom especificar o tipo de data, o código é:
Mais detalhes sobre as diferentes opções de análise http://amir-shenodua.blogspot.ie/2017/06/datetime-parsing-in-net.html
fonte
Experimente o seguinte código
fonte