[ 更新 : 格式说明符与格式字符串不同; 格式说明符是一段自定义格式字符串,其中格式字符串为’stock’,不提供自定义。我的问题是说明符不是格式 ]
我一直在尝试使用使用’zzz’格式说明符的格式字符串执行往返DateTime转换,我知道它与本地时间绑定。因此,如果我尝试使用UTC日期时间来回往返,它将引发DateTimeInvalidLocalFormat异常,该异常应带有以下文本:
UTC日期时间将以仅适用于当地时间的格式转换为文本。 使用“ z”格式说明符调用DateTime.ToString时可能会发生这种情况,该说明符将在输出中包含本地时区偏移量。 在这种情况下,请使用“ Z”格式说明符(用于指定UTC时间) ,或使用“ o”格式字符串(这是在文本中保留DateTime的推荐方法)。当传递要由XmlConvert或DataSet序列化的DateTime时,也会发生这种情况。如果使用XmlConvert.ToString,请传入XmlDateTimeSerializationMode.RoundtripKind以正确序列化。如果使用DataSet,请将DataColumn对象上的DateTimeMode设置为DataSetDateTime.Utc。
基于此建议,使我的代码正常工作所需要做的就是将“ zzz”替换为“ ZZZ”,以便可以使用UTC格式。问题是,在文档的任何地方都找不到“ Z”,而我尝试使用的任何“ Z”格式组合(即“ Z”,“ ZZ”,“ ZZZ”)始终只是将DateTime实例转换为那些Z,就像对待文字一样。
有人忘了在没有告知异常消息作者的情况下实现“ Z”的实现,还是我错过了如何在不被黑客入侵的情况下用“ +0000”换出有效的本地时间偏移量的方法?
代码示例:
// This is the format with 'zzzzz' representing local time offset const string format = "ddd MMM dd HH:mm:ss zzzzz yyyy"; // create a UTC time const string expected = "Fri Dec 19 17:24:18 +0000 2008"; var time = new DateTime(2008, 12, 19, 17, 24, 18, 0, DateTimeKind.Utc); // If you're using a debugger this will rightfully throw an exception // with .NET 3.5 SP1 because 'z' is for local time only; however, the exception // asks me to use the 'Z' specifier for UTC times, but it doesn't exist, so it // just spits out 'Z' as a literal. var actual = time.ToString(format, CultureInfo.InvariantCulture); Assert.AreEqual(expected, actual);
也许“ K”格式说明符会有所用。这是唯一提到使用大写字母“ Z”的词。
“ Z”是DateTimes的一种特殊情况。文字“ Z”实际上是UTC时间的ISO 8601日期时间标准的一部分。如果在时间结束时加上“ Z”(祖鲁语),则表示该时间是UTC,因此,实际的Z是时间的一部分。这可能会为.NET中的日期格式库带来一些问题,因为它实际上是文字,而不是格式说明符。