通过


dateTimeInvalidLocalFormat MDA

注释

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

dateTimeInvalidLocalFormat当存储为世界协调时(UTC)的实例使用仅用于本地DateTime实例的格式设置格式时DateTime,将激活 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 的方式。 使用“Z”表示 UTC 时间的建议格式:

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

此外,还有一种“o”格式,用于序列化DateTimeKind正确序列化的属性,无论实例是本地、UTC 还是未指定:

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

对运行时的影响

此 MDA 不会影响运行时。

输出

由于此 MDA 激活,没有特殊的输出。但是,调用堆栈可用于确定激活 MDA 的 ToString 调用的位置。

配置

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

示例

请考虑使用以下XmlConvert方式使用或DataSet类间接序列化 UTC DateTime 值的应用程序。

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

DataSet默认情况下,XmlConvert序列化使用本地格式进行序列化。 序列化其他类型的 DateTime 值(例如 UTC)需要其他选项。

对于此特定示例,请传入XmlDateTimeSerializationMode.RoundtripKindToString呼叫。XmlConvert 这会将数据序列化为 UTC 时间。

如果使用 aDataSet,请将DateTimeModeDataColumn对象上的属性设置为 Utc

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

另见