¿Cómo puedo formatear DateTime en formato web UTC?

Tengo un DateTime que quiero formatear a ” 2009-09-01T00:00:00.000Z “, pero el siguiente código me da ” 2009-09-01T00:00:00.000+01:00 ” (ambas líneas):

 new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz") new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz") 

¿Alguna idea de cómo hacer que funcione?

 string foo = yourDateTime.ToUniversalTime() .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'"); 

¿Por qué no utilizar simplemente el especificador de formato de ida y vuelta (“O”, “o”) ?

El especificador de formato estándar “O” o “o” representa una cadena de formato de fecha y hora personalizada utilizando un patrón que conserva la información de zona horaria y emite una cadena de resultados que cumple con ISO 8601. Para valores de DateTime, este especificador de formato está diseñado para preservar la fecha y valores de tiempo junto con la propiedad DateTime.Kind en el texto. La cadena formateada se puede analizar sintácticamente utilizando el método DateTime.Parse (String, IFormatProvider, DateTimeStyles) o DateTime.ParseExact si el parámetro de estilos se establece en DateTimeStyles.RoundtripKind.

El especificador de formato estándar “O” o “o” corresponde a la cadena de formato personalizado “yyyy ‘-‘ MM ‘-‘ dd’T’HH ‘:’ mm ‘:’ ss ‘.’ FffffffK” para los valores de DateTime y para el “yyyy ‘-‘ MM ‘-‘ dd’T’HH ‘:’ mm ‘:’ ss ‘.’ fffffffzzz” cadena de formato personalizado para los valores de DateTimeOffset. En esta cadena, los pares de comillas simples que delimitan caracteres individuales, como los guiones, los dos puntos y la letra “T”, indican que el carácter individual es un literal que no puede modificarse. Los apóstrofes no aparecen en la cadena de salida.

El especificador de formato estándar O “o” o “(y la cadena de formato personalizado” yyyy ‘-‘ MM ‘-‘ dd’T’HH ‘:’ mm ‘:’ ss ‘.’ FffffffK) aprovechan las tres formas que ISO 8601 representa información de zona horaria para conservar la propiedad Kind de los valores DateTime:

 public class Example { public static void Main() { DateTime dat = new DateTime(2009, 6, 15, 13, 45, 30, DateTimeKind.Unspecified); Console.WriteLine("{0} ({1}) --> {0:O}", dat, dat.Kind); DateTime uDat = new DateTime(2009, 6, 15, 13, 45, 30, DateTimeKind.Utc); Console.WriteLine("{0} ({1}) --> {0:O}", uDat, uDat.Kind); DateTime lDat = new DateTime(2009, 6, 15, 13, 45, 30, DateTimeKind.Local); Console.WriteLine("{0} ({1}) --> {0:O}\n", lDat, lDat.Kind); DateTimeOffset dto = new DateTimeOffset(lDat); Console.WriteLine("{0} --> {0:O}", dto); } } // The example displays the following output: // 6/15/2009 1:45:30 PM (Unspecified) --> 2009-06-15T13:45:30.0000000 // 6/15/2009 1:45:30 PM (Utc) --> 2009-06-15T13:45:30.0000000Z // 6/15/2009 1:45:30 PM (Local) --> 2009-06-15T13:45:30.0000000-07:00 // // 6/15/2009 1:45:30 PM -07:00 --> 2009-06-15T13:45:30.0000000-07:00 

El mejor formato para usar es “aaaa” – “MM” – “dd’T’HH”: “mm”: “ss”. “FffK”.

La última cadena de K en se cambiará a ‘Z’ si la fecha es UTC o con zona horaria (+ -hh: mm) si es local. ( http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx )

Como dijo LukeH, es bueno usar ToUniversalTime si desea que todas las fechas sean UTC.

El código final es:

 string foo = yourDateTime.ToUniversalTime() .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK"); 

Desea utilizar la clase DateTimeOffset .

 var date = new DateTimeOffset(2009, 9, 1, 0, 0, 0, 0, new TimeSpan(0L)); var stringDate = date.ToString("u"); 

perdón perdí tu formateo original con los milisegundos

 var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'"); 
 string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow) 

vuelve 2017-02-10T08: 12: 39.483Z

Algunas personas han señalado que ‘ToUniversalTime’ no es seguro ya que puede ocasionar disparos de tiempo incorrectos involuntarios. Ampliando eso estoy proporcionando un ejemplo más detallado de una solución. El ejemplo aquí crea una extensión para el objeto DateTime que devuelve de manera segura un DateTime UTC donde puede usar ToString como lo desee ….

 class Program { static void Main(string[] args) { DateTime dUtc = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Utc); DateTime dUnspecified = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Unspecified); //Sample of an unintended mangle: //Prints "2016-06-01 10:17:00Z" Console.WriteLine(dUnspecified.ToUniversalTime().ToString("u")); //Prints "2016 - 06 - 01 03:17:00Z" Console.WriteLine(dUtc.SafeUniversal().ToString("u")); //Prints "2016 - 06 - 01 03:17:00Z" Console.WriteLine(dUnspecified.SafeUniversal().ToString("u")); } } public static class ConvertExtensions { public static DateTime SafeUniversal(this DateTime inTime) { return (DateTimeKind.Unspecified == inTime.Kind) ? new DateTime(inTime.Ticks, DateTimeKind.Utc) : inTime.ToUniversalTime(); } } 

Este código me funciona:

 var datetime = new DateTime(2017, 10, 27, 14, 45, 53, 175, DateTimeKind.Local); var text = datetime.ToString("o"); Console.WriteLine(text); -- 2017-10-27T14:45:53.1750000+03:00 // datetime from string var newDate = DateTime.ParseExact(text, "o", null); 

Prueba esto:

 DateTime date = DateTime.ParseExact( "Tue, 1 Jan 2008 00:00:00 UTC", "ddd, d MMM yyyy HH:mm:ss UTC", CultureInfo.InvariantCulture); 

Pregunta previa