DateTime dönüştürmek? dizeye


11

Bir DateTime?dizgeye dönüştürmek istiyorum . Bir tarih null olursa, dönmek ""başka, böyle bir dize biçimini döndürebilir: "2020-03-05T07:52:59.665Z". Kod böyle bir şey ama işe yaramaz. "DateTime?""ToUniversalTime" için bir tanım içermediğini söyledi . Birisi bunu nasıl düzeltebilir?

DateTime? date = DateTime.UtcNow;

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

1
Bu arada, sadece istiyor .ToString("o")musun?
John

Oh, zaten DateTime.UTCNow kullanıyorum, bu yüzden artık ToUniversalTime () kullanmanıza gerek yok? @John. Ah .ToString("o"), anlıyorum, daha fazla araştırma yapacağım. Teşekkür ederim!
camahe

1
Gerçekten de, sadece bir ISO8601 formatı istediğinizi varsayarsak, "o" kullanabilirsiniz. Belgeleri
John

@John: "o", ISO-8601 uyumlu olmasına rağmen istenmeyebilecek kene hassasiyetini kullanır.
Jon Skeet

1
"Ama .ToString (" o ") kullandığımda Z yok" - hala ToUniversalTime () çağırırsanız olacak; 'Z' bir çeşit UTC'ye sahip.
Jon Skeet

Yanıtlar:


16

DateTime? bir Value özelliği ve bir HasValue özelliği vardır

Deneyin:

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

Kısa versiyonu kullanabilirsiniz:

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

8

Eğer kullanabilirsiniz iken ValueLeszek en Yanıt başına kadar doğrudan tesisle, muhtemelen boş-kaynaştırma operatör ile birlikte boş-koşullu operatörü kullanırsınız:

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

Burada ?.null olursa sadece null değerine neden olur ve çağrı sonucu datenull ise ??operatör varsayılan bir değer sağlar date?.ToUniversalTime().ToString(...)(yalnızca datenull olduğunda olur ).

Geçerli iş parçacığının kültürü Gregoryen takvimini kullanmadığında beklenmedik sonuçlar elde etmemek için değişmez kültürü belirtmek istediğinizi ve biçim dizesindeki tüm bu değişmezleri alıntılamanız gerekmediğini unutmayın. Bunu yaptığınızda kesinlikle işe yarıyor , ancak IMO'yu okumak daha zor.

Dizede ne kadar hassasiyetin ifade edildiğini düşünmezseniz, "O" standart biçim dizesini kullanarak kodu basitleştirebilirsiniz :

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

Bu noktada CultureInfo.InvariantCulture, her zaman "O" tarafından kullanıldığı için belirtmeniz gerekmez .


1
Neden "O"biçim dizesi olarak kullanılmıyor? docs.microsoft.com/tr-tr/dotnet/standard/base-types/…
Zohar Peled

1
@ZoharPeled: Kene hassasiyeti var ve OP görünüşe göre sadece milisaniye hassasiyet istiyor.
Jon Skeet

Aslında Zdizenin sonunda bir format istiyorum
camahe

1
@camahe: "O" biçim belirteci zaten bunu kullanıyor - Zohar'ın yayınladığı belge bağlantısına bakın. Gerçekten kaç basamak hassasiyet elde ederseniz, "O" kullanmak çok daha kolay olurdu - bu durumda da CultureInfo.InvariantCulture belirtmeniz gerekmez. Bir seçenek olarak eklemek için cevabı değiştirir.
Jon Skeet

2
@camahe: Lütfen bir soru sorduğunuzda , gereksinimlerinizde gerçekten hassas olmanıza yardımcı olan bir ders alın .
Jon Skeet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.