J'ai un DateTime que je veux formater en " 2009-09-01T00:00:00.000Z
", mais le code suivant me donne " 2009-09-01T00:00:00.000+01:00
" (les deux lignes):
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")
Des idées pour le faire fonctionner?
.ToUniversalTime()
tout ce que vous voulez, cela ne la changera pas. - Cependant, si vous avez une valeur de temps universel stockée en tant qu'heure locale, alors bien sûr elle la changera (mais dans ce cas, vous avez de plus gros problèmes à résoudre!) - Quoi qu'il en soit, cette réponse est terrible. Vous devez utiliser la"O"
chaîne de format comme spécifié par la réponse ci-dessous, à la place.2009-09-01T00:00:00.000Z
. En utilisant le spécificateur « O » serait leur donner quelque chose de différent:2009-09-01T00:00:00.0000000Z
.Pourquoi ne pas simplement utiliser le spécificateur de format aller-retour ("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
la source
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz"
n'est pas le format Zulu.dtVariable.ToUniversalTime().ToString("o")
qui se convertira en"2019-05-26T19:50:34.4400000Z"
ou"yyyy-MM-ddTHH:mm:ss.fffffffZ"
. Remarque: j'ai également testé cela avec lanew Date(dtDateString).getTime()
méthode Javscript et il analyse correctement la chaîne de date produite par cela.dto.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFF'Z'")
. Pour mémoire,"o"
ajoute juste un décalage, ce n'est pas au format Zulu.$"{DateTime.UtcNow:O}"
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)
renvoie 2017-02-10T08: 12: 39.483Z
la source
Le meilleur format à utiliser est "aaaa '-' MM '-' jj'T'HH ':' mm ':' ss '.' FffK".
Le dernier K sur la chaîne sera changé en «Z» si la date est UTC ou avec le fuseau horaire (+ -hh: mm) si est local. ( http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx )
Comme LukeH l'a dit, il est bon d'utiliser ToUniversalTime si vous voulez que toutes les dates soient UTC.
Le code final est:
string foo = yourDateTime.ToUniversalTime() .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK");
la source
Certaines personnes ont souligné que «ToUniversalTime» est quelque peu dangereux en ce sens qu'il peut provoquer des erreurs d'heure involontaires. En développant cela, je donne un exemple plus détaillé d'une solution. L'exemple ici crée une extension de l'objet DateTime qui renvoie en toute sécurité un DateTime UTC où vous pouvez utiliser ToString comme vous le souhaitez….
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(); } }
la source
Vous souhaitez utiliser la classe DateTimeOffset .
var date = new DateTimeOffset(2009, 9, 1, 0, 0, 0, 0, new TimeSpan(0L)); var stringDate = date.ToString("u");
désolé j'ai manqué votre formatage d'origine avec les millisecondes
var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
la source
Ce code fonctionne pour moi:
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);
la source
Essaye ça:
DateTime date = DateTime.ParseExact( "Tue, 1 Jan 2008 00:00:00 UTC", "ddd, d MMM yyyy HH:mm:ss UTC", CultureInfo.InvariantCulture);
Question posée précédemment
la source