Tengo una fecha y hora 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?
.ToUniversalTime()
todo lo que quiera, no la cambiará. - Sin embargo, si tiene un valor de tiempo universal almacenado como hora local, entonces, por supuesto, lo cambiará (pero en ese caso, ¡tendrá problemas mayores con los que lidiar!) - De todos modos, esta respuesta es terrible. En su lugar, debe usar la"O"
cadena de formato como se especifica en la respuesta a continuación.2009-09-01T00:00:00.000Z
. El uso de la "O" especificador les daría algo diferente:2009-09-01T00:00:00.0000000Z
.¿Por qué no utilizar el Especificador de formato de ida y vuelta ("O", "o") ?
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
fuente
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz"
no es el formato Zulu.dtVariable.ToUniversalTime().ToString("o")
que se convertirá en"2019-05-26T19:50:34.4400000Z"
o"yyyy-MM-ddTHH:mm:ss.fffffffZ"
. Nota: También probé esto con elnew Date(dtDateString).getTime()
método de Javscript y analiza correctamente la cadena de fecha producida por esto.dto.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFF'Z'")
. Para el registro, solo"o"
agrega desplazamiento, no es formato Zulu.$"{DateTime.UtcNow:O}"
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)
devuelve 2017-02-10T08: 12: 39.483Z
fuente
El mejor formato para usar es "aaaa '-' MM '-' dd'T'HH ':' mm ':' ss '.' FffK".
La última K en la cadena se cambiará a 'Z' si la fecha es UTC o con la 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");
fuente
Algunas personas han señalado que 'ToUniversalTime' es algo inseguro ya que puede causar disparos de tiempo incorrectos no deseados. 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 forma segura un DateTime UTC donde puede usar ToString como 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(); } }
fuente
Quieres usar la clase DateTimeOffset .
var date = new DateTimeOffset(2009, 9, 1, 0, 0, 0, 0, new TimeSpan(0L)); var stringDate = date.ToString("u");
lo siento, me perdí su formato original con milisegundos
var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
fuente
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);
fuente
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 hecha anteriormente
fuente