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

Supongo que esto debería ser bastante simple, pero no pude conseguirlo :(. En este formato, Z es la zona horaria.
T es un patrón de tiempo largo
¿Cómo podría obtener una fecha en este formato, excepto mediante el uso de

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

Cª#

Usando UTC

ISO 8601 ( formatos de fecha y hora de MSDN )

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

2009-11-13T10: 39: 35Z

La Z está ahí porque

Si la hora está en UTC, agregue una ‘Z’ directamente después del tiempo sin espacio. ‘Z’ es el designador de zona para el desplazamiento UTC cero. “09:30 UTC” se representa por lo tanto como “09: 30Z” o “0930Z”. “14:45:15 UTC” sería “14: 45: 15Z” o “144515Z”.

Si desea incluir un desplazamiento

 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); 

Dos cosas a tener en cuenta: + o – es necesario después del tiempo, pero obviamente + no se muestra en los números positivos. Según wikipedia, el desplazamiento puede estar en formato + hh o + hh: mm. Me he limitado a solo horas.

Hasta donde yo sé, RFC1123 (fecha HTTP, el formateador “u”) no está destinado a dar compensaciones de zona horaria. Todos los horarios están destinados a ser GMT / UTC.

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

Productos:

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

El formato “o” es diferente para DateTime frente a DateTimeOffset 🙁

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

Mi respuesta final es

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

Mire aquí los patrones “u” y “s”. Primero, sin el separador ‘T’, y el segundo sin sufijo de zona horaria.

Una opción podría ser convertir DateTime a ToUniversalTime () antes de convertir a cadena con el formato “o” . Por ejemplo,

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

Saldrá:

 2016-01-31T20:16:01.9092348Z 

Código de una sola línea para esto.

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

Funciona bien con los formatos de fecha y hora de consulta de API REST de 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 

Devuelve los resultados de Salesforce sin ningún problema.

En C # 6+ puedes usar la interpolación de cuerdas y hacer esto más escueto:

 $"{DateTime.UtcNow:s}Z" 

Podrías dividir las cosas, requeriría más código pero funcionaría como a ti te gusta:

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

ect.

finalmente:

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

Esta es una forma muy audaz de manejarlo …