注
この記事は .NET Framework に固有のものです。 .NET 6 以降のバージョンを含む、.NET の新しい実装には適用されません。
dateTimeInvalidLocalFormat MDA は、世界協定時刻 (UTC) として格納されているDateTime インスタンスが、ローカル DateTime インスタンスでのみ使用される形式を使用して書式設定されている場合にアクティブ化されます。 この MDA は、指定されていないインスタンスまたは既定の DateTime インスタンスではアクティブ化されません。
症状:
アプリケーションは、ローカル形式を使用して 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 にはローカル タイム ゾーン オフセットが含まれますが、タイム ゾーン指定子は表示または調整されません。
Resolution
UTC DateTime インスタンスは、UTC であることを示す形式にする必要があります。 UTC 時刻を表すために 'Z' を使用する場合に推奨される形式は次のとおりです。
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffZ"));
インスタンスがローカル、UTC、または指定されていないかどうかに関係なく、正しくシリアル化するKind プロパティを使用してDateTimeをシリアル化する "o" 形式もあります。
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のシリアル化では、既定でシリアル化にローカル形式が使用されます。 UTC など、他の種類の DateTime 値をシリアル化するには、追加のオプションが必要です。
この具体的な例では、XmlConvertのToString呼び出しにXmlDateTimeSerializationMode.RoundtripKindを渡します。 これにより、データが UTC 時刻としてシリアル化されます。
DataSetを使用する場合は、DataColumn オブジェクトのDateTimeMode プロパティをUtcに設定します。
DateTime myDateTime = DateTime.UtcNow;
String serialized = XmlConvert.ToString(myDateTime,
XmlDateTimeSerializationMode.RoundtripKind);
こちらも参照ください
.NET