1. ホーム
  2. c#

DateTimeの'Z'フォーマット指定子はどこですか?

2023-10-20 02:34:09

質問

[ 更新 : フォーマット指定子とフォーマット文字列は同じものではありません。フォーマット指定子はカスタムフォーマット文字列の一部であり、フォーマット文字列は「純正」であり、カスタマイズを提供するものではありません。私の問題は、フォーマットではなくスペシファイアにあります。 ]

私は、'zzz' 書式指定子を使用するフォーマット文字列で DateTime のラウンド トリップ変換を実行しようとしています。UTC 日付時刻でラウンド トリップしようとすると、このテキストと共に DateTimeInvalidLocalFormat 例外をスローします。

UTC DateTime は、ローカル時間に対してのみ正しい形式でテキストに変換されます。これは、'z' 書式指定子を使用して DateTime.ToString を呼び出したときに発生する可能性があり、出力にローカル タイム ゾーンのオフセットが含まれることになります。 この場合、UTC時間を指定する'Z'フォーマット指定子を使うか、UTC時間を指定する または、テキストでDateTimeを保持するために推奨される'o'フォーマット文字列を使用します。この問題は、XmlConvert や DataSet でシリアライズする DateTime を渡すときにも発生することがあります。XmlConvert.ToString を使用する場合は、XmlDateTimeSerializationMode.RoundtripKind を渡して正しくシリアライズしてください。DataSetを使用する場合は、DataColumnオブジェクトのDateTimeModeをDataSetDateTime.Utcに設定します。

この提案に基づいて、私のコードを動作させるために必要なことは、UTC フォーマットで立つことができるように 'zzz' を 'ZZZ' に置き換えることです。問題は、'Z' はドキュメントのどこにもなく、'Z'、'ZZ'、'ZZZ' など、私が試したどの 'Z' 形式の組み合わせも常に、これらの Z がリテラルのように扱われて DateTime インスタンスを変換するだけです。

誰かが例外メッセージの作成者に伝えることなく 'Z' を実装するのを忘れたのか、または、ハッキングせずに有効なローカル時間オフセットを "+0000" と交換する方法を私は見逃しているのでしょうか?

コード例。

コード例:

// This is the format with 'zzzzz' representing local time offset
const string format = "ddd MMM dd HH:mm:ss zzzzz yyyy";

// create a UTC time
const string expected = "Fri Dec 19 17:24:18 +0000 2008";
var time = new DateTime(2008, 12, 19, 17, 24, 18, 0, DateTimeKind.Utc);

// If you're using a debugger this will rightfully throw an exception
// with .NET 3.5 SP1 because 'z' is for local time only; however, the exception
// asks me to use the 'Z' specifier for UTC times, but it doesn't exist, so it
// just spits out 'Z' as a literal.
var actual = time.ToString(format, CultureInfo.InvariantCulture);

Assert.AreEqual(expected, actual);

どのように解決するのですか?

多分、"K" のフォーマット指定子が役に立つと思います。 これは、大文字の "Z" の使用について言及している唯一のものです。

"Z"は、DateTimes のための一種のユニークなケースです。 リテラルな "Z" は、実際には UTC 時刻の ISO 8601 datetime 標準の一部です。 Z"(ズールー語)が時刻の最後に付けられると、その時刻がUTCであることを示すので、実際にはリテラルZは時刻の一部です。 これは、形式指定子ではなく実際にリテラルであるため、おそらく.NETの日付形式ライブラリにいくつかの問題を生じさせます。