J'ai beaucoup cherché mais je n'ai pas trouvé de solution. Comment gérez-vous un DateTime qui devrait pouvoir contenir une valeur non initialisée (équivalente à null)? J'ai une classe qui pourrait avoir une valeur de propriété DateTime définie ou non. Je pensais à initialiser le propriétaire de la propriété à DateTime.MinValue, qui pourrait ensuite être facilement vérifié. Je suppose que c'est une question assez courante, comment faites-vous cela?
273
DateTime.MinValue
aussi bienMyNullableDate=date;
définir,MyDate = MyNullableDate.Value;
le lire etif(MyNullableDate.HasValue)
vérifier s'il est nulSi vous utilisez .NET 2.0 (ou version ultérieure), vous pouvez utiliser le type nullable:
ou
puis plus tard:
Et vous pouvez vérifier la valeur avec:
Ou vous pouvez l'utiliser comme:
Vous pouvez en savoir plus ici:
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx
la source
dt.GetValueOrDefault()
- c'est l'option la plus efficace.DateTime? MyDateTime {get; set;}
la source
null
ne fonctionne tout simplement pas. Cela doit être(DateTime?)null
.La voie suivante fonctionne également
Veuillez noter que la propriété PublishDate doit être DateTime?
la source
J'envisagerais d'utiliser un type nullable .
DateTime? myDate
au lieu deDateTime myDate
.la source
Il convient de souligner que, même si une
DateTime
variable ne peut pas l'êtrenull
, elle peut toujours être comparéenull
sans erreur de compilation:la source
Vous pouvez utiliser une classe nullable.
la source
DateTime
. Comme mentionné précédemment,new DateTime()
vous donnera effectivementDateTime.Min
alors quenew DateTime?()
résultera en null.Vous pouvez utiliser un DateTime nullable pour cela.
ou la même chose écrite comme ceci:
la source
Vous pouvez définir le DateTime sur Nullable. Par défaut, DateTime n'est pas nullable. Vous pouvez le rendre nullable de deux manières. Vous utilisez un point d'interrogation après le type DateTime? myTime ou en utilisant le style générique Nullable.
ou
la source
Je fixe toujours l'heure
DateTime.MinValue
. De cette façon, je n'obtiens aucune NullErrorException et je peux le comparer à une date dont je sais qu'elle n'est pas définie.la source
Soyez juste averti - Lorsque vous utilisez un Nullable, ce n'est évidemment plus un objet datetime «pur», en tant que tel, vous ne pouvez pas accéder directement aux membres DateTime. Je vais essayer d'expliquer.
En utilisant Nullable <>, vous enveloppez essentiellement DateTime dans un conteneur (merci génériques) dont la valeur est nullable - évidemment son objectif. Ce conteneur possède ses propres propriétés que vous pouvez appeler pour donner accès à l'objet DateTime susmentionné; après avoir utilisé la bonne propriété - dans ce cas Nullable.Value - vous avez alors accès aux membres, propriétés, etc. de DateTime standard.
Donc - maintenant, le problème vient à l'esprit quant à la meilleure façon d'accéder à l'objet DateTime. Il y a plusieurs façons, le numéro 1 est de loin le meilleur et 2 est "mec pourquoi".
En utilisant la propriété Nullable.Value,
DateTime date = myNullableObject.Value.ToUniversalTime(); //Works
DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails
Conversion de l'objet nullable en datetime à l'aide de Convert.ToDateTime (),
DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...
Bien que la réponse soit bien documentée à ce stade, je pense que l'utilisation de Nullable valait probablement la peine d'être publiée. Désolé si vous n'êtes pas d'accord.
edit: Suppression d'une troisième option car elle était un peu trop spécifique et dépendait de la casse.
la source
Bien que tout le monde vous ait déjà donné la réponse, je mentionnerai un moyen qui permet de passer facilement un datetime dans une fonction
[ERREUR: impossible de convertir system.datetime? à system.datetime]
Vous pouvez maintenant passer dte à l'intérieur de la fonction sans aucun problème.
la source
Si vous vous attendez parfois à null, vous pouvez utiliser quelque chose comme ceci:
Dans votre référentiel, utilisez datetime nullable.
la source
J'ai eu le même problème que je devais donner Null comme paramètre pour DateTime lors de l'exécution du test unitaire pour Throws ArgumentNullException.Il a fonctionné dans mon cas en utilisant l'option suivante:
la source
Étant donné la nature d'un type de données date / heure, il ne peut pas contenir de
null
valeur, c'est-à-dire qu'il doit contenir une valeur, il ne peut pas être vide ou ne rien contenir. Si vous marquez une variable date / heure commenullable
alors, vous pouvez lui attribuer une valeur nulle. Donc, ce que vous cherchez à faire est l'une des deux choses (il y en a peut-être plus mais je ne pense qu'à deux):Attribuez une valeur de date / heure minimale à votre variable si vous n'en avez pas de valeur. Vous pouvez également attribuer une valeur de date / heure maximale, selon la manière qui vous convient. Assurez-vous simplement que vous êtes cohérent à l'échelle du site lorsque vous vérifiez vos valeurs de date / heure. Décidez d'utiliser
min
oumax
et respectez-le.Marquez votre variable date / heure comme
nullable
. De cette façon, vous pouvez définir votre variable date / heurenull
si vous ne disposez pas d'une variable.Permettez-moi de démontrer mon premier point en utilisant un exemple. Le
DateTime
type de variable ne peut pas être défini sur null, il a besoin d'une valeur, dans ce cas, je vais le définir à laDateTime
valeur minimale de s'il n'y a pas de valeur.Mon scénario est que j'ai une
BlogPost
classe. Il a de nombreux champs / propriétés différents mais j'ai choisi de n'en utiliser que deux pour cet exemple.DatePublished
correspond au moment où la publication a été publiée sur le site Web et doit contenir une valeur date / heure.DateModified
c'est quand un article est modifié, il ne doit donc pas contenir de valeur, mais peut contenir une valeur.Utilisation
ADO.NET
pour obtenir les données de la base de données (attribuerDateTime.MinValue
s'il n'y a pas de valeur):Vous pouvez accomplir mon deuxième point en marquant le
DateModified
champ commenullable
. Vous pouvez maintenant le définirnull
s'il n'y a pas de valeur:En utilisant
ADO.NET
pour obtenir les données de la base de données, cela ressemblera un peu à la façon dont cela a été fait ci-dessus (en assignantnull
au lieu deDateTime.MinValue
):J'espère que cela aide à dissiper toute confusion. Étant donné que ma réponse est d'environ 8 ans plus tard, vous êtes probablement un programmeur C # expert maintenant :)
la source