Convertir DateTime? à la chaîne


11

Je veux convertir une DateTime?chaîne. Si une date est nulle puis revenir "", sinon retourne un format de chaîne comme ceci: "2020-03-05T07:52:59.665Z". Le code est quelque chose comme ça mais ça ne marchera pas. Il a déclaré "DateTime?"ne pas contenir de définition de "ToUniversalTime". Quelqu'un sait comment résoudre ce problème?

DateTime? date = DateTime.UtcNow;

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

1
Au fait, tu veux juste .ToString("o")?
John

Oh, j'utilise déjà DateTime.UTCNow donc je n'ai plus besoin d'utiliser ToUniversalTime ()? @John. Ah je vois, .ToString("o")je vais chercher plus. Je vous remercie!
camahe

1
En effet, et en supposant que vous vouliez juste un format ISO8601, vous pouvez utiliser "o". Voir les documents
John

@John: "o" utilise la précision des ticks, ce qui peut ne pas être souhaitable même s'il est conforme à la norme ISO-8601.
Jon Skeet

1
"Mais quand j'utilise .ToString (" o "), il n'a pas Z" - il le sera si vous appelez toujours ToUniversalTime (); le «Z» vient de lui ayant une sorte d'UTC.
Jon Skeet

Réponses:


16

Le DateTime? a une propriété Value et une propriété HasValue

Essayer:

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

Vous pouvez utiliser une version courte:

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

8

Bien que vous puissiez utiliser la Valuepropriété directement selon la réponse de Leszek, j'utiliserais probablement l'opérateur null-conditionnel en conjonction avec l'opérateur null-coalescing:

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

Ici, le ?.va juste entraîner une valeur nulle si dateest nul, et l' ??opérateur fournira une valeur par défaut si le résultat de l' date?.ToUniversalTime().ToString(...)appel est nul (ce qui ne se produirait que si dateest nul).

Notez que vous voulez vraiment spécifier la culture invariante pour éviter d'obtenir des résultats inattendus lorsque la culture du thread actuel n'utilise pas le calendrier grégorien, et vous n'avez pas besoin de citer tous ces littéraux dans la chaîne de format. Cela fonctionne certainement lorsque vous le faites, mais il est plus difficile de lire l'OMI.

Si la précision exprimée dans la chaîne ne vous dérange pas, vous pouvez simplifier le code en utilisant la chaîne de format standard "O" :

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

À ce stade, vous n'avez pas besoin de spécifier CultureInfo.InvariantCulturecar il est toujours utilisé par "O".


1
Pourquoi ne pas utiliser "O"comme chaîne de format? docs.microsoft.com/en-us/dotnet/standard/base-types/…
Zohar Peled

1
@ZoharPeled: Cela a une précision de tick, et l'OP ne veut apparemment qu'une précision en millisecondes.
Jon Skeet

En fait, je veux un format qui a Zà la fin de la chaîne
camahe

1
@camahe: Le spécificateur de format "O" l'utilise déjà - voir le lien de documentation publié par Zohar. Si vous ne vous souciez vraiment pas du nombre de chiffres de précision que vous obtenez, l'utilisation de "O" serait beaucoup plus simple - vous n'auriez pas besoin de spécifier CultureInfo.InvariantCulture dans ce cas non plus. Modifie la réponse pour l'ajouter en option.
Jon Skeet

2
@camahe: Veuillez en tirer une leçon: lorsque vous posez une question, cela aide à être très précis dans vos besoins.
Jon Skeet
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.