Respostas:
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".
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.
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
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
Em C # 6+, você pode usar interpolação de string e torná-la mais concisa:
$"{DateTime.UtcNow:s}Z"
Veja aqui os padrões "u" e "s". O primeiro é sem o separador 'T' e o segundo sem o sufixo de fuso horário.
Código de linha única para isso.
var temp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");
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.
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 ...
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?