我如何格式化date时间到networkingUTC格式?

我有一个DateTime,我想格式为“2009-09-01T00:00:00.000Z”,但下面的代码给了我“2009-09-01T00:00:00.000 + 01:00”(两行):

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

任何想法如何使其工作?

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

为什么不使用“往返”(“O”,“o”)格式说明符 ?

“O”或“o”标准格式说明符使用保留时区信息的模式表示自定义date和时间格式string,并发出符合ISO 8601的结果string。对于DateTime值,此格式说明符用于保留date和时间值以及文本中的DateTime.Kind属性。 如果styles参数设置为DateTimeStyles.RoundtripKind,则可以使用DateTime.Parse(String,IFormatProvider,DateTimeStyles)或DateTime.ParseExact方法来parsing格式化的string。

“O”或“o”标准格式说明符对应于“date时间”值的“yyyy” – “MM” – “dd'T'HH”:“mm”:“ss”。“fffffffK”自定义格式string。 “yyyy” – “MM” – “dd'T'HH”:'mm':'ss'。'fffffffzzz'用于DateTimeOffset值的自定义格式string。 在此string中,分隔各个字符(如连字符,冒号和字母“T”)的单引号对指示单个字符是不能更改的文字。 撇号不会出现在输出string中。

O“或”O“标准格式说明符(以及”yyyy“ – ”MM“ – ”dd'T'HH“:'mm':'ss'。'fffffffK'自定义格式string)利用三种方式ISO 8601表示保留DateTime值的Kind属性的时区信息:

 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 

最好使用的格式是“yyyy” – “MM” – “dd'T'HH”:'mm':'ss'。'fffK“。

如果date是UTC或带有时区(+ -hh:mm),如果是本地的,则string上的最后一个K将被更改为“Z”。 ( http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

正如LukeH所说,如果您希望所有的date都是UTC,那么使用ToUniversalTime是一件好事。

最终的代码是:

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

你想使用DateTimeOffset类。

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

对不起,我错过了你的原始格式与毫秒

 var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'"); 

有人指出,“通达时代”有些不安全,可能造成意想不到的错误时间差距。 扩展,我提供了一个更详细的解决scheme的例子。 这里的示例创build一个DateTime对象的扩展,安全地返回一个UTC DateTime,您可以根据需要使用ToString …。

 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(); } } 
 string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow) 

回报2017-02-10T08:12:39.483Z

此代码正在为我工​​作:

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

尝试这个:

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

以前问过的问题