日時を変換しますか?文字列に


11

DateTime?文字列に変換したいのですが。日付がnullの場合はを返し""、それ以外の場合は次のような文字列形式を返します"2020-03-05T07:52:59.665Z"。コードはこのようなものですが、機能しません。"DateTime?"「ToUniversalTime」の定義は含まれていないとのことです。誰かがこれを修正する方法を知っていますか?

DateTime? date = DateTime.UtcNow;

var dateInUTCString = date == null ? "" : date.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");

1
ちなみに、あなただけが欲しい.ToString("o")ですか?
John

ああ、すでにDateTime.UTCNowを使用しているので、ToUniversalTime()を使用する必要はもうありませんか?@ジョン。なるほど.ToString("o")、もっと詳しく調べます。ありがとうございました!
camahe

1
実際、ISO8601フォーマットだけが必要な場合は、「o」を使用できます。ドキュメントを
John

@John: "o"は目盛りの精度を使用します。これはISO-8601に準拠していても望ましくない場合があります。
Jon Skeet

1
「しかし、.ToString( "o")を使用するとき、Zはありません」-それでもToUniversalTime()を呼び出すと、'Z'は、一種のUTCを持つことから来ています。
Jon Skeet

回答:


16

DateTime?ValueプロパティとHasValueプロパティがあります

試してください:

var dateInUTCString = date.HasValue ? date.Value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'") : "";

あなたは短いバージョンを使うことができます:

var dateInUTCString = date?.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'") ?? "";

8

ValueLeszekの回答に従ってプロパティを直接使用できますが、おそらくnull条件演算子とnull融合演算子を併用します。

string dateInUTCString =
    date?.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture) 
    ?? "";

ここで?.あれば、単にヌル値になりますdatenullがある、と??の結果ならば、オペレータは、デフォルト値を提供しますdate?.ToUniversalTime().ToString(...)コールがnull(場合にのみ起こるこれはdateヌルです)。

現在のスレッドのカルチャがグレゴリオ暦を使用していない場合に予期しない結果が発生しないように、インバリアントカルチャを本当に指定し、フォーマット文字列でこれらのリテラルをすべて引用符で囲む必要がないことに注意してください。それは確かにうまくいきますそうすればしますが、IMOを読むのは難しくなります。

文字列で表現される精度が気にならない場合は、「O」標準形式の文字列を使用してコードを単純にすることができます

string dateInUTCString = date?.ToUniversalTime().ToString("O") ?? "";

その時点であなたは指定する必要はありませんCultureInfo.InvariantCultureということと、常に「O」で使用されます。


1
"O"フォーマット文字列として使用しないのはなぜですか? docs.microsoft.com/en-us/dotnet/standard/base-types/...
ゾハルPeled

1
@ZoharPeled:これには目盛りの精度があり、OPは明らかにミリ秒の精度しか必要としません。
Jon Skeet

実際にZは、文字列の最後にあるフォーマットが必要です
camahe

1
@camahe:「O」フォーマット指定子はすでにそれを使用しています-Zoharが投稿したドキュメントリンクを参照してください。取得する桁数が本当に気にならない場合は、「O」を使用する方がはるかに簡単です。その場合も、CultureInfo.InvariantCultureを指定する必要はありません。選択肢を追加して回答を修正します。
Jon Skeet

2
@camahe:あなたが質問をするとき、それがために役立つことがこのことからレッスンを受けてください本当にあなたの要件の正確な。
Jon Skeet
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.