formato de data aaaa-MM-ddTHH: mm: ssZ


102

Presumo que deva ser bem simples, mas não foi possível :(. Neste formato, Z é o fuso horário.
T é o padrão de tempo longo
Como posso obter uma data neste formato, exceto usando

DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-ddTHH:mm:ssZ"));

em C #


Eu sei que esta pergunta já existe há 9 anos, mas a resposta aceita UtcNow.ToString(s)+Zé a errada. ISO8601 é compatível com a opção RoundTripToString("O") . Também para apontar que a resposta aceita usa o valor UTC do datetime, que sempre daria o fuso horário Z, em vez de apenas usar o valor real do datetime, que (se Kind = Local) pode conter um fuso horário de verão. Considere alterar a resposta aceita?
Richardissimo

Respostas:


144

Usando UTC

ISO 8601 ( formatos de data e hora MSDN )

Console.WriteLine(DateTime.UtcNow.ToString("s") + "Z");

13-11-2009T10: 39: 35Z

O Z está aí porque

Se a hora estiver em UTC, adicione um 'Z' diretamente após a hora sem espaço. 'Z' é o designador de zona para o deslocamento UTC zero. "09:30 UTC" é, portanto, representado como "09: 30Z" ou "0930Z". "14:45:15 UTC" seria "14: 45: 15Z" ou "144515Z".

Se você quiser incluir um deslocamento

int hours = TimeZoneInfo.Local.BaseUtcOffset.Hours;
string offset = string.Format("{0}{1}",((hours >0)? "+" :""),hours.ToString("00"));
string isoformat = DateTime.Now.ToString("s") + offset;
Console.WriteLine(isoformat);

Duas coisas a serem observadas: + ou - é necessário após o tempo, mas obviamente + não aparece em números positivos. De acordo com a Wikipedia, o deslocamento pode estar no formato + hh ou + hh: mm. Eu guardei apenas algumas horas.

Pelo que eu sei, o RFC1123 (data HTTP, o formatador "u") não foi criado para fornecer ajustes de fuso horário. Todos os horários são GMT / UTC.


Legal. Porém, sua saída não inclui o deslocamento TZ?
Neil Barnwell

Eu o adicionei em - os documentos dizem que o formato de 's' é baseado em ISO8601, eu não acho que inclui o fuso horário.
Chris S

Claro, o UTC não tem fusos horários. D'oh. Ele está pedindo informações de fuso horário em sua saída. Talvez o DateTimeOffset seja o que ele está procurando?
Neil Barnwell

5
Adicionar Z aqui manualmente não é bom, você deve usar .ToString ("o") porque ele fornecerá a saída adequada. Se os milissegundos forem um problema, eles devem ser arredondados. Adicionar Z manualmente pode dar resultado incorreto se você adicioná-lo à hora local, que não é realmente UTC.
Tuukka Lindroos,

67
Console.WriteLine(DateTime.UtcNow.ToString("o"));  
Console.WriteLine(DateTime.Now.ToString("o"));

Saídas:

2012-07-09T19:22:09.1440844Z  
2012-07-09T12:22:09.1440844-07:00

Usei Console.WriteLine (DateTime.Now.ToString ("o")) ;. Obrigado
Ziggler

5
A resposta aceita diz para usar o especificador de formato "s" e acrescentar um Z no final para as datas UTC. Tudo bem se você não precisar dos milissegundos, mas se quiser os milissegundos, terá que usar "o" como mostra a resposta. Com "o", os milissegundos aparecem por padrão e o Z já está anexado no final para datas UTC.
Jim

1
DateTime.Now.ToString ("o") Resolve todos os tipos de problemas porque retorna o deslocamento correto com ele.
Mo Zaatar

12

O formato "o" é diferente para DateTime vs DateTimeOffset :(

DateTime.UtcNow.ToString("o") -> "2016-03-09T03:30:25.1263499Z"

DateTimeOffset.UtcNow.ToString("o") -> "2016-03-09T03:30:46.7775027+00:00"

Minha resposta final é

DateTimeOffset.UtcDateTime.ToString("o")   //for DateTimeOffset type
DateTime.UtcNow.ToString("o")              //for DateTime type

7

Em C # 6+, você pode usar interpolação de string e torná-la mais concisa:

$"{DateTime.UtcNow:s}Z"

você economizou muito tempo. Solução simples e doce.
Raju Paladiya

6

Veja aqui os padrões "u" e "s". O primeiro é sem o separador 'T' e o segundo sem o sufixo de fuso horário.


5

Código de linha única para isso.

var temp   =  DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");

5

Uma opção poderia ser converter DateTime em ToUniversalTime () antes de converter em string usando o formato "o" . Por exemplo,

var dt = DateTime.Now.ToUniversalTime();
Console.WriteLine(dt.ToString("o"));

Irá produzir:

2016-01-31T20:16:01.9092348Z

2

Funciona bem com formatos de data e hora de consulta da API REST do Salesforce

DateTime now = DateTime.UtcNow;
string startDate = now.AddDays(-5).ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");   
string endDate = now.ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");  
//REST service Query 
string salesforceUrl= https://csxx.salesforce.com//services/data/v33.0/sobjects/Account/updated/?start=" + startDate + "&end=" + endDate;

// https://csxx.salesforce.com/services/data/v33.0/sobjects/Account/updated/?start=2015-03-10T15:15:57Z&end=2015-03-15T15:15:57Z

Ele retorna os resultados do Salesforce sem problemas.


-6

Você poderia dividir as coisas, isso exigiria mais código, mas funcionaria do jeito que você gosta:

DateTime year = DateTime.Now.Year;
DateTime month = DateTime.Now.Month;
DateTime day = DateTime.Now.Day;

ect.

finalmente:

Console.WriteLine(year+month+day+etc.);

Esta é uma maneira muito ousada de lidar com isso ...


Esta resposta não produz nada como a saída desejada
cja

Isso não forneceu o que a pergunta ou eu queria ... -1
Ziggler
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.