一尘不染

DateTime'Z'格式说明符在哪里?

c#

[ 更新格式说明符与格式字符串不同;
格式说明符是一段自定义格式字符串,其中格式字符串为’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);

阅读 13286

收藏
2020-05-19

共1个答案

一尘不染

也许“ K”格式说明符会有所用。这是唯一提到使用大写字母“ Z”的词。

“ Z”是DateTimes的一种特殊情况。文字“ Z”实际上是UTC时间的ISO 8601日期时间标准的一部分。如果在时间结束时加上“
Z”(祖鲁语),则表示该时间是UTC,因此,实际的Z是时间的一部分。这可能会为.NET中的日期格式库带来一些问题,因为它实际上是文字,而不是格式说明符。

2020-05-19