Eu descobri como transformar um DateTime em um ISO 8601 formato , mas nada sobre como fazer o inverso em c #.
Eu tenho 2010-08-20T15:00:00Z
, e quero transformá-lo em um DateTime
objeto.
Eu mesmo poderia separar as partes da corda, mas isso parece muito trabalho para algo que já é um padrão internacional.
Respostas:
Esta solução utiliza a enumeração DateTimeStyles e também funciona com Z.
Isso imprime a solução perfeitamente.
fonte
DateTime d2= DateTime.Parse("2010-08-20T15:00:00Z", null, DateTimeStyles.RoundtripKind);
parece funcionar bem.DateTimeStyles.RoundtripKind?
descrição do MSDN está em branco.2018-06-19T14:56:14.123Z
é analisado como hora local, não como UTC. Eu uso emCultureInfo.InvariantCulture
vez de nulo.DateTimeStyles.RoundTripKind
, consulte stackoverflow.com/q/39572395/2014893Embora o MSDN diga que os formatos "s" e "o" refletem o padrão, eles parecem capazes de analisar apenas um subconjunto limitado dele. Especialmente, é um problema se a string contiver especificação de fuso horário. (Nem nos formatos ISO8601 básicos ou nos formatos de precisão reduzida - no entanto, esse não é exatamente o seu caso.) É por isso que uso seqüências de caracteres de formato personalizado quando se trata de analisar o ISO8601. Atualmente, meu snippet preferido é:
Se você não se importa de analisar cadeias sem TZ (sim), você pode adicionar uma linha "s" para aumentar bastante o número de alterações de formato cobertas.
fonte
"yyyyMMdd"
naformats
matriz uma precisão reduzida a dias, pois às vezes é o caso em que uma RFC 5545 RRULE conta com um DTSTART para fornecer o tempo.K
permite rolar os diferentes tratamentos de fuso horário juntos. Eu tenho uma variante mais extensa em stackoverflow.com/a/31246449/400547, mas é muito extensa (aceita coisas que são válidas ISO 8601, mas não usadas nos perfis mais comuns), mas mostra comoK
reduzir o tamanho por um terceiro.fonte
Aqui está um que funciona melhor para mim ( versão LINQPad ):
produz
fonte
Parece importante corresponder exatamente ao formato da string ISO para
TryParseExact
funcionar. Eu acho que exato é exato e esta resposta é óbvia para a maioria, mas de qualquer maneira ...No meu caso, a resposta do Reb.Cabin não funciona, pois tenho uma entrada ligeiramente diferente conforme meu "valor" abaixo.
Valor:
2012-08-10T14:00:00.000Z
Existem alguns milhares extras por milissegundos e pode haver mais.
No entanto, se eu adicionar alguns
.fff
ao formato, como mostrado abaixo, está tudo bem.Formatar sequência:
@"yyyy-MM-dd\THH:mm:ss.fff\Z"
Na janela imediata do VS2010:
verdade
Você pode ter que usar
DateTimeStyles.AssumeLocal
também, dependendo de qual zona é o seu tempo ...fonte
AssumeUniversal
paraAdjustToUniversal
.Isso funciona bem no LINQPad4:
fonte
DateTime.ParseExact(...)
permite que você diga ao analisador o que cada caractere representa.fonte