DateTimeの'Z'フォーマット指定子はどこですか?
質問
[ 更新 : フォーマット指定子とフォーマット文字列は同じものではありません。フォーマット指定子はカスタムフォーマット文字列の一部であり、フォーマット文字列は「純正」であり、カスタマイズを提供するものではありません。私の問題は、フォーマットではなくスペシファイアにあります。 ]
私は、'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の日付形式ライブラリにいくつかの問題を生じさせます。
関連
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] DateTime型の誕生日から年齢を計算するにはどうしたらいいですか?
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] Pythonでタイムゾーンを意識したdatetimeオブジェクトを作るには?
-
[解決済み] ローカルタイム文字列をUTCに変換する方法は?
-
[解決済み】文字列をdatetimeに変換する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?