Dado:
DateTime.UtcNow
Como obtenho uma string que representa o mesmo valor em um formato compatível com ISO 8601 ?
Observe que a ISO 8601 define vários formatos semelhantes. O formato específico que estou procurando é:
yyyy-MM-ddTHH:mm:ssZ
Nota para os leitores: Vários comentaristas apontaram alguns problemas nesta resposta (relacionados principalmente à primeira sugestão). Consulte a seção de comentários para obter mais informações.
DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffffffzzz");
Isso fornece uma data semelhante a 2008-09-22T13: 57: 31.2311892-04: 00 .
Outra maneira é:
DateTime.UtcNow.ToString("o");
que lhe dá 2008-09-22T14: 01: 54.9571247Z
Para obter o formato especificado, você pode usar:
DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")
ToString("yyyy-MM-ddTHH:mm:ssK")
para isso funcionar (com o plugin jquery timeago que eu estava usando).dt.ToString("s") + dt.ToString("zzz")
// 2013-12-05T07: 19: 04-08: 00DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture)
deve fornecer o que você está procurando, pois o especificador de formato "s" é descrito como um padrão de data / hora classificável; está em conformidade com a ISO 8601.fonte
DateTime.UtcNow.ToString(CultureInfo.InvariantCulture.DateTimeFormat.SortableDateTimePattern);
No entanto, uma vez que todos estes excluir o fuso horário, etc., você pode ter escolha a não ser usar o formatador explícita, ou seja"yyyy-MM-ddTHH:mm:ss.fffZ"
Z
assim:DateTime.UtcNow.ToString(c, CultureInfo.InvariantCulture)) => 2012-06-26T11:55:36
e não há uma resolução de milissegundos que é muito boa de ter, já que os computadores fazem um número razoável de ticks por segundo.o
o2012-06-26T11:55:36.1007668Z
significado dos36.1007668
segundos, você obtém a resolução de até1/10^7
um segundo. De ISO8601: 2004If a decimal fraction is included, lower order time elements (if any) shall be omitted and the decimal fraction shall be divided from the integer part by the decimal sign [...] the comma (,) or full stop (.)
"s"
não faz sentido porque: "" O "(ou" o ")," R "(ou" r ")," s "e" u ". Essas cadeias correspondem a cadeias de formato personalizadas definidas pela cultura invariável. Eles produzem representações de string de valores de data e hora que devem ser idênticos entre as culturas. ”DateTime.Now.ToString("s", new CultureInfo(myCulture))
.Retorna algo como 2008-04-10T06: 30: 00
UtcNow
obviamente, retorna um horário UTC para que não haja danos em:fonte
a + b
compila com o mesmo código intermediário questring.Concat(a, b)
(assumindo que aeb são seqüências de caracteres, é claro), portanto não há diferença no desempenho ou no consumo de memória.Usar:
RESULTADO
Fontes:
Strings de formato de data e hora padrão (MSDN)
Strings de formato de data e hora personalizadas (MSDN)
fonte
string strLocalTimeAndOffset_custom = localTimeAndOffset.ToString("yyyy-MM-ddTHH:mm:ssK");
resultaria em:strLocalTimeAndOffset_custom: 2012-09-17T22:02:51-07:00
o
é um formato ISO-8601.=>
fonte
Você pode obter o "Z" ( ISO 8601 UTC ) com o próximo código:
Aqui está o porquê:
A ISO 8601 possui alguns formatos diferentes:
DateTimeKind.Local
DateTimeKind.Utc
DateTimeKind.Unspecified
O .NET nos fornece uma enumeração com essas opções:
Nota : Se você aplicar o "utilitário de observação" do Visual Studio 2008 ao toString ("o") poderá obter resultados diferentes, não sei se é um erro, mas, nesse caso, você terá melhores resultados usando uma variável String se você estiver depurando.
Origem: Strings de formato de data e hora padrão (MSDN)
fonte
Se você deve usar o DateTime para ISO 8601, o ToString ("o") deve render o que você está procurando. Por exemplo,
No entanto, o DateTime + TimeZone pode apresentar outros problemas, conforme descrito na postagem do blog DateTime e DateTimeOffset no .NET: Boas práticas e armadilhas comuns :
fonte
Surpreendeu que ninguém o sugeriu:
O UniversalSortableDateTimePattern leva você até o que você deseja (que é mais uma representação da RFC 3339 ).
Adicionado: decidi usar os benchmarks que estavam em resposta https://stackoverflow.com/a/43793679/653058 para comparar o desempenho.
tl: dr; está no fim caro, mas ainda tem pouco mais de meio milissegundo no meu velho e ruim laptop :-)
Implementação:
Resultados:
fonte
Eu usaria apenas
XmlConvert
:Ele preservará automaticamente o fuso horário.
fonte
A maioria dessas respostas possui milissegundos / microssegundos, o que claramente não é suportado pela ISO 8601. A resposta correta seria:
Referências:
fonte
NOTA: Dependendo da conversão que você está fazendo, você estará usando a primeira linha (mais parecida) ou a segunda.
Certifique-se de aplicar o formato apenas no horário local, pois "zzz" é a informação de fuso horário para a conversão UTC.
fonte
- do MSDN
fonte
.ToString("s")
?Para converter DateTime.UtcNow em uma representação de seqüência de aaaa-MM-ddTHH: mm: ssZ , você pode usar o método ToString () da estrutura DateTime com uma seqüência de formatação personalizada. Ao usar seqüências de caracteres de formato personalizado com um DateTime, é importante lembrar que você precisa escapar de seus separadores usando aspas simples.
A seguir, retornará a representação de string que você queria:
fonte
É interessante que o formato personalizado "aaaa-MM-ddTHH: mm: ssK" (sem ms) seja o método de formato mais rápido.
Também é interessante que o formato "S" seja lento no Classic e rápido no Core ...
É claro que os números são muito próximos, entre algumas linhas a diferença é insignificante (os testes com sufixo
_Verify
são os mesmos que os que estão sem esse sufixo, demonstram a repetibilidade dos resultados)Código:
https://github.com/dotnet/BenchmarkDotNet foi usado
fonte
Usando o Newtonsoft.Json, você pode fazer
Exemplo: https://dotnetfiddle.net/O2xFSl
fonte
Se você estiver desenvolvendo no SharePoint 2010 ou superior, poderá usar
fonte
.ToString("o")
ou melhor$"My complicated string {dt:o}"
.Para formatar como 2018-06-22T13: 04: 16 que pode ser passado no URI de uma API, use:
fonte
Como mencionado em outra resposta,
DateTime
tem problemas por design.NodaTime
Sugiro usar o NodaTime para gerenciar valores de data / hora:
Formatação
Portanto, para criar e formatar,
ZonedDateTime
você pode usar o seguinte snippet de código:Para mim, o
NodaTime
código parece bem detalhado. Mas tipos são realmente úteis. Eles ajudam a lidar com os valores de data / hora corretamente.Newtonsoft.Json
fonte