[ 更新: 格式说明符与格式字符串不同; 格式说明符是自定义格式字符串的一部分,其中的格式字符串是“ stock”,不提供自定义。我的问题是说明符不是格式]
我一直在尝试用一个使用“ zzz”格式说明符的格式字符串执行往返 DateTime 转换,我知道这个格式字符串绑定到本地时间。因此,如果我尝试使用 UTC 日期时间来回旅行,它会抛出一个 DateTimeInvalidLocalFormat 异常,它应该这样做,如下所示:
正在将 UTC DateTime 转换为只适用于本地时间的格式的文本。当使用‘ z’格式说明符调用 DateTime.ToString 时可能会发生这种情况,该格式说明符将在输出中包含一个本地时区偏移量。或者使用‘ o’格式字符串,这是在文本中保持 DateTime 的推荐方法。在传递要由 XmlConvert 或 DataSet 序列化的 DateTime 时也可能发生这种情况。如果使用 XmlConvert.ToString,请传入 XmlDateTimeSerializationMode。正确序列化。如果使用 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);