dateTimeInvalidLocalFormat MDA

注意

本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。

使用只打算用于本地 DateTime 实例的格式对存储为协调世界时 (UTC) 的 DateTime 实例设置格式时,将激活 dateTimeInvalidLocalFormat MDA。 对于未指定的或默认的 DateTime 实例,不激活此 MDA。

症状

应用程序使用本地格式手动序列化 UTC DateTime 实例:

DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffzzz"));

原因

DateTime.ToString 方法的“z”格式包括本地时区偏移量,例如,“+10:00”表示悉尼时间。 就这一点而言,只有 DateTime 值是本地时间时,它才会得出有意义的结果。 如果该值是 UTC 时间,则 DateTime.ToString 包括本地时区偏移量,但是不显示或调整时区说明符。

解决方法

应采用可表明 UTC DateTime 实例为 UTC 时间的方式设置这些实例的格式。 对于 UTC 时间的格式,建议使用一个“Z”表示 UTC 时间:

DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffZ"));

还有一种利用正确序列化的 Kind 属性序列化 DateTime 的“o”格式,而不管实例是本地时间、UTC 时间还是未指定的时间:

DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("o"));

对运行时的影响

此 MDA 不影响运行时。

输出

不存在作为此 MDA 激活的结果的特殊输出。但是,可使用调用堆栈确定激活此 MDA 的 ToString 调用的位置。

Configuration

<mdaConfig>
  <assistants>
    <dateTimeInvalidLocalFormat />
  </assistants>
</mdaConfig>

示例

假设应用程序按以下方式使用 XmlConvertDataSet 类间接序列化 UTC DateTime 值。

DateTime myDateTime = DateTime.UtcNow;
String serialized = XMLConvert.ToString(myDateTime);

XmlConvertDataSet 序列化默认使用本地格式进行序列化。 序列化其他种类的 DateTime 值(例如 UTC)需要其他选项。

对于此特定示例,将 XmlDateTimeSerializationMode.RoundtripKind 传递给 XmlConvert 上的 ToString 调用。 这会将数据序列化为 UTC 时间。

如果使用 DataSet,则将 DataColumn 对象上的 DateTimeMode 属性设置为 Utc

DateTime myDateTime = DateTime.UtcNow;
String serialized = XmlConvert.ToString(myDateTime,
    XmlDateTimeSerializationMode.RoundtripKind);

请参阅