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>
範例
請以下列方式考慮使用利用 XmlConvert 或 DataSet 類別間接序列化 UTC DateTime 值的應用程式。
DateTime myDateTime = DateTime.UtcNow;
String serialized = XMLConvert.ToString(myDateTime);
XmlConvert 和 DataSet 序列化預設會使用當地格式進行序列化。 需要其他選項,才能序列化其他類型的 DateTime 值,例如 UTC。
在此特定範例中,將 XmlDateTimeSerializationMode.RoundtripKind
傳入 XmlConvert
上的 ToString
呼叫。 這會將資料序列化為 UTC 時間。
如果使用 DataSet,請將 DataColumn 物件上的 DateTimeMode 屬性設定為 Utc。
DateTime myDateTime = DateTime.UtcNow;
String serialized = XmlConvert.ToString(myDateTime,
XmlDateTimeSerializationMode.RoundtripKind);