Convertire DateTime? accordare


11

Voglio convertire una DateTime?stringa. Se la data è nullo per poi tornare "", altrimenti restituire una stringa di formato come questo: "2020-03-05T07:52:59.665Z". Il codice è qualcosa del genere ma non funzionerà. Ha detto "DateTime?"che non contengono una definizione per "ToUniversalTime". Qualcuno sa come risolvere questo?

DateTime? date = DateTime.UtcNow;

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

1
A proposito, vuoi solo .ToString("o")?
Giovanni

Oh, uso già DateTime.UTCNow quindi non ho più bisogno di usare ToUniversalTime ()? @John. Ah vedo, .ToString("o")cercherò di più. Grazie!
Camahe

1
In effetti, e supponendo che tu voglia solo un formato ISO8601, puoi usare "o". Vedi la documentazione
Giovanni

@John: "o" usa la precisione tick, che potrebbe non essere desiderabile anche se è conforme ISO-8601.
Jon Skeet,

1
"Ma quando uso .ToString (" o "), non ha Z" - lo farà se chiami ancora ToUniversalTime (); la "Z" deriva da un tipo di UTC.
Jon Skeet,

Risposte:


16

The DateTime? ha una proprietà Value e una proprietà HasValue

Provare:

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

Puoi usare la versione breve:

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

8

Sebbene sia possibile utilizzare la Valueproprietà direttamente secondo la risposta di Leszek, probabilmente utilizzerei l'operatore null-condizionale insieme all'operatore null-coalescing:

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

Qui il ?.risultato sarà solo un valore null se dateè null e l' ??operatore fornirà un valore predefinito se il risultato della date?.ToUniversalTime().ToString(...)chiamata è null (cosa che succederebbe solo se datefosse null).

Nota che vuoi davvero specificare la cultura invariante per evitare di ottenere risultati imprevisti quando la cultura della discussione corrente non usa il calendario gregoriano e non hai bisogno di citare tutti quei letterali nella stringa di formato. Certamente funziona quando lo fa, ma è più difficile da leggere IMO.

Se non ti dispiace quanta precisione è espressa nella stringa, puoi semplificare il codice usando la stringa di formato standard "O" :

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

A quel punto non è necessario specificare CultureInfo.InvariantCulturecome viene sempre utilizzato da "O".


1
Perché non utilizzare "O"come stringa di formato? docs.microsoft.com/en-us/dotnet/standard/base-types/…
Zohar Peled

1
@ZoharPeled: ha una precisione di tick e l'OP apparentemente vuole solo una precisione di millisecondi.
Jon Skeet,

In realtà voglio un formato che abbia Zla fine della stringa
camahe

1
@camahe: l'identificatore di formato "O" lo utilizza già - vedere il collegamento alla documentazione pubblicato da Zohar. Se davvero non ti dispiace quante cifre di precisione ottieni, usare "O" sarebbe molto più semplice - in questo caso non dovrai nemmeno specificare CultureInfo.InvariantCulture. Modificherà la risposta per aggiungerla come opzione.
Jon Skeet,

2
@camahe: per favore, prendi una lezione da questo che quando fai una domanda, ti aiuta a essere veramente preciso nelle tue esigenze.
Jon Skeet,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.