共用方式為


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"));

也有 "o" 格式可序列化利用正確序列化之 Kind 屬性的 DateTime,不論執行個體是當地時間、UTC 還是未指定都一樣:

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

對執行階段的影響

此 MDA 不會影響執行階段。

輸出

此 MDA 啟用沒有任何特殊輸出。不過,呼叫堆疊可以用來決定已啟用 MDA 之 ToString 呼叫的位置。

組態

<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);

另請參閱