Comment puis-je convertir le nullTable DateTime dt2 en une chaîne formatée?
DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss")); //works
DateTime? dt2 = DateTime.Now;
Console.WriteLine(dt2.ToString("yyyy-MM-dd hh:mm:ss")); //gives following error:
aucune surcharge à la méthode ToString ne prend un argument
c#
datetime
formatting
nullable
Edward Tanguay
la source
la source
Réponses:
EDIT: Comme indiqué dans d'autres commentaires, vérifiez qu'il existe une valeur non nulle.
Mise à jour: comme recommandé dans les commentaires, méthode d'extension:
Et à partir de C # 6, vous pouvez utiliser l' opérateur de condition nulle pour simplifier encore plus le code. L'expression ci-dessous renverra null si le
DateTime?
est null.la source
Essayez ceci pour la taille:
L'objet dateTime réel que vous cherchez à formater se trouve dans la propriété dt.Value et non sur l'objet dt2 lui-même.
la source
Vous êtes trop en train de concevoir tout cela et de le rendre beaucoup plus compliqué qu'il ne l'est vraiment. Chose importante, arrêtez d'utiliser ToString et commencez à utiliser le formatage de chaîne comme string.Format ou des méthodes qui prennent en charge le formatage de chaîne comme Console.WriteLine. Voici la solution préférée à cette question. C'est aussi le plus sûr.
Mettre à jour:
Je mets à jour les exemples avec les méthodes à jour du compilateur C # d'aujourd'hui. opérateurs conditionnels et interpolation de chaînes
Sortie: (je mets des guillemets simples pour que vous puissiez voir qu'elle revient comme une chaîne vide lorsqu'elle est nulle)
la source
Comme d'autres l'ont indiqué, vous devez vérifier la valeur null avant d'appeler ToString, mais pour éviter de vous répéter, vous pouvez créer une méthode d'extension qui fait cela, quelque chose comme:
Qui peut être invoqué comme:
la source
Bébé C # 6.0:
dt2?.ToString("dd/MM/yyyy");
la source
Console.WriteLine(dt2?.ToString("yyyy-MM-dd hh:mm:ss" ?? "n/a");
Le problème avec la formulation d'une réponse à cette question est que vous ne spécifiez pas la sortie souhaitée lorsque le datetime nullable n'a aucune valeur. Le code suivant sortira
DateTime.MinValue
dans un tel cas, et contrairement à la réponse actuellement acceptée, ne lèvera pas d'exception.la source
Voyant que vous voulez réellement fournir le format, je suggère d'ajouter l'interface IFormattable à la méthode d'extension Smalls comme ça, de cette façon, vous n'avez pas la concaténation de format de chaîne désagréable.
la source
Qu'en est-il de quelque chose d'aussi simple que cela:
la source
Vous pouvez utiliser
dt2.Value.ToString("format")
, mais bien sûr cela nécessite que dt2! = Null, et cela annule l'utilisation d'un type nullable en premier lieu.Il existe plusieurs solutions ici, mais la grande question est: comment voulez-vous formater une
null
date?la source
Voici une approche plus générique. Cela vous permettra de formater une chaîne de n'importe quel type de valeur nullable. J'ai inclus la deuxième méthode pour permettre de remplacer la valeur de chaîne par défaut au lieu d'utiliser la valeur par défaut pour le type de valeur.
la source
Réponse la plus courte
Les tests
la source
Encore une meilleure solution en C # 6.0:
la source
Syntaxe RAZOR:
la source
Je pense que vous devez utiliser la méthode GetValueOrDefault. Le comportement avec ToString ("yy ...") n'est pas défini si l'instance est nulle.
la source
Voici l'excellente réponse de Blake comme méthode d'extension. Ajoutez ceci à votre projet et les appels dans la question fonctionneront comme prévu.
Cela signifie qu'il est utilisé comme
MyNullableDateTime.ToString("dd/MM/yyyy")
, avec la même sortie queMyDateTime.ToString("dd/MM/yyyy")
, sauf que la valeur sera"N/A"
si le DateTime est nul.la source
IFormattable comprend également un fournisseur de format qui peut être utilisé, il permet aux deux formats de IFormatProvider d'être nuls dans dotnet 4.0, ce serait
en utilisant avec des paramètres nommés, vous pouvez faire:
dt2.ToString (defaultValue: "n / a");
Dans les anciennes versions de dotnet, vous obtenez beaucoup de surcharges
la source
J'aime cette option:
la source
Extensions génériques simples
la source
C'est peut-être une réponse tardive mais peut aider quelqu'un d'autre.
C'est simple:
ou utilisez simplement n'importe quel format plutôt que "d".
Meilleur
la source
vous pouvez utiliser une ligne simple:
la source