Eu tenho um DateTime que desejo formatar para " 2009-09-01T00:00:00.000Z
", mas o código a seguir me dá " 2009-09-01T00:00:00.000+01:00
" (ambas as linhas):
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")
Alguma ideia de como fazer funcionar?
.ToUniversalTime()
quanto quiser, isso não vai mudar. - No entanto, se você tem um valor de hora universal armazenado como hora local, então é claro que ele irá alterá-lo (mas, nesse caso, você terá problemas maiores para lidar!) - De qualquer forma, esta resposta é Terrível. Você deve usar a"O"
string de formato conforme especificado pela resposta abaixo.2009-09-01T00:00:00.000Z
. Usando o especificador "O" lhes daria algo diferente:2009-09-01T00:00:00.0000000Z
.Por que não usar apenas o especificador de formato Round-trip ("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
fonte
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz"
não é o formato Zulu.dtVariable.ToUniversalTime().ToString("o")
que irá converter para"2019-05-26T19:50:34.4400000Z"
ou"yyyy-MM-ddTHH:mm:ss.fffffffZ"
. Nota: Eu também testei isso com onew Date(dtDateString).getTime()
método Javscript e ele analisa corretamente a string de data produzida por isso.dto.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFF'Z'")
. Para o registro, apenas"o"
adiciona deslocamento, não é o formato Zulu.$"{DateTime.UtcNow:O}"
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)
retorna 2017-02-10T08: 12: 39.483Z
fonte
fff
vez deFFF
ou 000 não será exibido por um segundo exatamente na marca.O melhor formato a ser usado é "aaaa '-' MM '-' dd'T'HH ':' mm ':' ss '.' FffK".
O último K na string será alterado para 'Z' se a data for UTC ou com fuso horário (+ -hh: mm) se for local. ( http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx )
Como disse o LukeH, é bom usar o ToUniversalTime se quiser que todas as datas sejam UTC.
O código final é:
string foo = yourDateTime.ToUniversalTime() .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK");
fonte
Algumas pessoas apontaram que 'ToUniversalTime' é um tanto inseguro, pois pode causar exibições incorretas de hora não intencionais. Expandindo isso, estou fornecendo um exemplo mais detalhado de uma solução. O exemplo aqui cria uma extensão para o objeto DateTime que retorna com segurança um DateTime UTC onde você pode usar ToString conforme desejado….
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(); } }
fonte
Você deseja usar a classe DateTimeOffset .
var date = new DateTimeOffset(2009, 9, 1, 0, 0, 0, 0, new TimeSpan(0L)); var stringDate = date.ToString("u");
desculpe, eu perdi sua formatação original com os milissegundos
var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
fonte
Este código está funcionando para mim:
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);
fonte
Experimente isto:
DateTime date = DateTime.ParseExact( "Tue, 1 Jan 2008 00:00:00 UTC", "ddd, d MMM yyyy HH:mm:ss UTC", CultureInfo.InvariantCulture);
Pergunta anterior
fonte