Konversi DateTime? ke string

11

Saya ingin mengonversi menjadi DateTime?string. Jika kencan adalah null kemudian kembali "", yang lain kembali format string seperti ini: "2020-03-05T07:52:59.665Z". Kodenya kira-kira seperti ini tetapi tidak berfungsi. Dikatakan "DateTime?"tidak mengandung definisi untuk "ToUniversalTime". Ada yang tahu bagaimana cara memperbaikinya?

DateTime? date = DateTime.UtcNow;

var dateInUTCString = date == null ? "" : date.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
camahe
sumber
1
Ngomong-ngomong, apa yang Anda inginkan .ToString("o")?
John
Oh, saya sudah menggunakan DateTime.UTCSekarang jadi saya tidak perlu menggunakan ToUniversalTime () lagi? @ John Ah, begitu .ToString("o"), saya akan meneliti lebih lanjut. Terima kasih!
camahe
1
Memang, dan dengan asumsi Anda hanya menginginkan format ISO8601, Anda dapat menggunakan "o". Lihat dokumen
Yohanes
@ John: "o" menggunakan presisi kutu, yang mungkin tidak diinginkan meskipun memenuhi persyaratan ISO-8601.
Jon Skeet
1
"Tapi ketika saya menggunakan .ToString (" o "), itu tidak memiliki Z" - itu akan terjadi jika Anda masih memanggil ToUniversalTime (); 'Z' berasal darinya yang memiliki semacam UTC.
Jon Skeet

Jawaban:

16

DateTime? memiliki properti Value dan properti HasValue

Mencoba:

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

Anda dapat menggunakan versi pendek:

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

Meskipun Anda dapat menggunakan Valueproperti secara langsung sesuai jawaban Leszek, saya mungkin akan menggunakan operator kondisional-nol bersama dengan operator penggabungan-nol:

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

Di sini ?.hanya akan menghasilkan nilai nol jika datenol, dan ??operator akan memberikan nilai default jika hasil date?.ToUniversalTime().ToString(...)panggilan adalah nol (yang hanya akan terjadi jika datebernilai nol).

Perhatikan bahwa Anda benar-benar ingin menentukan budaya invarian untuk menghindari mendapatkan hasil yang tidak terduga ketika budaya utas saat ini tidak menggunakan kalender Gregorian, dan Anda tidak perlu mengutip semua literal dalam string format. Ini pasti berfungsi ketika Anda melakukannya, tetapi lebih sulit untuk membaca IMO.

Jika Anda tidak keberatan berapa banyak ketepatan diekspresikan dalam string, Anda dapat membuat kode lebih sederhana menggunakan string format standar "O" :

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

Pada titik itu Anda tidak perlu menentukan CultureInfo.InvariantCulturekarena itu selalu digunakan oleh "O".

Jon Skeet
sumber
1
Mengapa tidak digunakan "O"sebagai format string? docs.microsoft.com/en-us/dotnet/standard/base-types/…
Zohar Peled
1
@ZoharPeled: Itu memiliki ketepatan kutu, dan OP tampaknya hanya menginginkan presisi milidetik.
Jon Skeet
Sebenarnya saya ingin format yang ada Zdi akhir string
camahe
1
@camahe: Penentu format "O" sudah menggunakannya - lihat tautan dokumentasi yang diposting Zohar. Jika Anda benar-benar tidak keberatan berapa banyak angka presisi yang Anda dapatkan, menggunakan "O" akan jauh lebih mudah - Anda tidak perlu menentukan CultureInfo.InvariantCulture dalam hal itu juga. Akan mengubah jawaban untuk menambahkan itu sebagai opsi.
Jon Skeet
2
@camahe: Silakan ambil pelajaran dari ini bahwa ketika Anda mengajukan pertanyaan, itu membantu untuk menjadi sangat tepat dalam persyaratan Anda.
Jon Skeet