Valeur "null" de DateTime

j'ai cherché beaucoup mais je n'ai pas trouvé de solution. Comment gérer 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 ou pas. Je pensais initialiser le détenteur de la propriété à DateTime.MinValue, qui pourrait alors être facilement vérifiée. Je suppose que c'est une question assez courante, Comment faites-vous cela?

231
demandé sur Mats 2008-10-21 16:54:32

15 réponses

pour les DateTimes normales, si vous ne les initialisez pas du tout , alors ils correspondront DateTime.MinValue , parce que c'est un type de valeur plutôt qu'un type de référence.

vous pouvez également utiliser un DateTime nul, comme ceci:

DateTime? MyNullableDate;

ou la forme plus longue:

Nullable<DateTime> MyNullableDate;

et, enfin, il y a un built in way pour référencer la valeur par défaut de n'importe quel type. Cela renvoie null pour les types de référence, mais pour notre exemple DateTime il retournera le même que DateTime.MinValue :

default(DateTime)
359
répondu Joel Coehoorn 2016-07-26 17:31:59

si vous utilisez .NET 2.0 (ou une version ultérieure) , vous pouvez utiliser le type nul:

DateTime? dt = null;

ou

Nullable<DateTime> dt = null;

puis plus tard:

dt = new DateTime();

Et vous pouvez vérifier la valeur:

if (dt.HasValue)
{
  // Do something with dt.Value
}

Ou vous pouvez l'utiliser comme:

DateTime dt2 = dt ?? DateTime.MinValue;

vous pouvez lire plus ici:

http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

76
répondu Mark Ingram 2012-02-24 08:31:52

DateTime? MyDateTime{get; set;}

MyDateTime = (drOrder["Field1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)drOrder["Field1"]);
22
répondu Iman Abidi 2011-08-22 12:50:38

de Cette façon, de fonctionner aussi bien

myClass.PublishDate = toPublish ? DateTime.Now : (DateTime?)null;

veuillez noter que la propriété Publisdate doit être DateTime?

12
répondu Aleksei 2017-02-06 06:21:38

j'envisagerais d'utiliser un type nul .

DateTime? myDate au lieu de DateTime myDate .

11
répondu David Mohundro 2014-02-27 22:53:09

Vous pouvez utiliser une classe nullable.

DateTime? date = new DateTime?();
6
répondu Aaron Smith 2008-10-21 12:56:47

vous pouvez utiliser un DateTime nul pour cela.

Nullable<DateTime> myDateTime;

ou la même chose écrit comme ceci:

DateTime? myDateTime;
6
répondu Patrik Svensson 2008-10-21 12:56:57

je fixe toujours l'heure à DateTime.MinValue . De cette façon, je ne reçois aucune NullErrorException et je peux le comparer à une date que je sais n'est pas fixé.

5
répondu Patrick Desjardins 2008-10-21 12:57:16

il est intéressant de souligner que, si une variable DateTime ne peut pas être null , elle peut tout de même être comparée à null sans erreur de compilateur:

DateTime date;
...
if(date == null) // <-- will never be 'true'
  ...
5
répondu uncoder 2015-10-06 19:30:44

vous pouvez définir le DateTime à Nullable. Par défaut DateTime n'est pas nul. Vous pouvez le rendre nul de plusieurs façons. Utiliser un point d'interrogation après le type DateTime? myTime ou en utilisant le style Générique Nullable. J'ai ajouté quelques liens sur msdn.

Utilisant Nullable

Nullable

4
répondu user29958 2008-10-21 13:27:33

juste être averti - lors de l'utilisation d'une Nullable son évidemment plus un objet datetime 'pur', comme tel, vous ne pouvez pas accéder aux membres DateTime directement. Je vais essayer de l'expliquer.

en utilisant Nullable<> vous enveloppez essentiellement DateTime dans un conteneur (merci génériques) dont est nullable - évidemment son but. Ce conteneur a ses propres propriétés que vous pouvez appeler qui fournira l'accès à L'objet DateTime susmentionné; après avoir utilisé le correct propriété - dans ce cas, les valeurs null.Value - vous avez alors accès aux membres DateTime standard, aux propriétés, etc.

maintenant, la question qui vient à l'esprit quant à la meilleure façon d'accéder à l'objet DateTime. Il y a plusieurs façons, la première est de loin la meilleure et la deuxième est "dude why".

  1. à l'Aide de la Nullable.Biens de valeur,

    DateTime date = myNullableObject.Value.ToUniversalTime(); //Works

    DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails

  2. la Conversion de la nullable objet de type datetime l'aide Convertir.ToDateTime (),

    DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...

bien que la réponse soit bien documentée à ce stade, je crois que l'usage de Nullable était probablement intéressant à signaler. Désolé si vous êtes en désaccord.

edit: a supprimé une troisième option car elle était un peu trop spécifique et dépendante du cas.

3
répondu Gabe 2016-01-28 07:45:58

bien que tout le monde vous ait déjà donné la réponse , je vais mentionner un moyen qui rend facile de passer un datetime dans une fonction

[erreur:Impossible de convertir le système.datetime? pour le système.datetime]

DateTime? dt = null;
DateTime dte = Convert.ToDateTime(dt);

Maintenant vous pouvez passer dte à l'intérieur de la fonction sans aucun problème.

2
répondu No Holidays 2016-07-18 11:26:25

si vous êtes, parfois, en attente null, Vous pouvez utiliser quelque chose comme ceci:

var orderResults = Repository.GetOrders(id, (DateTime?)model.DateFrom, (DateTime?)model.DateTo)

dans votre référentiel, utilisez le DateTime null-able.

public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...}
1
répondu DarkoM 2013-05-14 12:19:09

j'ai eu le même problème que j'ai dû donner Null comme paramètre pour DateTime tout en effectuant un test unitaire pour les lancers ArgumentNullException.Il a fonctionné dans mon cas en utilisant l'option suivante:

Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null));
1
répondu Kiril Dobrev 2017-02-19 13:22:12

étant donné la nature d'un type de données date/heure, il ne peut pas contenir une valeur null , c'est-à-dire qu'il doit contenir une valeur, il ne peut pas être vide ou ne contenir rien. Si vous marquez une variable date/heure comme nullable , alors vous ne pouvez lui attribuer qu'une valeur nulle. Donc, ce que vous cherchez à faire, c'est une de deux choses (il y en a peut-être plus, mais je n'en vois que deux):

  • attribuez une date/heure minimale à votre variable si vous n'avez pas de de la valeur pour elle. Vous pouvez également attribuer une date/heure maximale - selon ce qui vous convient. Assurez-vous simplement que vous êtes cohérent à l'échelle du site lors de la vérification de vos valeurs de date/heure. Décider d'utiliser min ou max et s'y tenir.

  • marquez votre variable date/heure comme nullable . De cette façon, vous pouvez définir votre date/heure variable null si vous n'avez pas une variable.

Permettez-moi d'illustrer mon premier point par un exemple. Le type de variable DateTime ne peut pas être défini à null, il a besoin d'une valeur, dans ce cas, je vais le définir à la valeur minimale du DateTime s'il n'y a pas de valeur.

mon scénario est que j'ai une classe BlogPost . Il a de nombreux champs/propriétés différents, mais j'ai choisi d'en utiliser seulement deux pour cet exemple. DatePublished est la date à laquelle le message a été publié sur le site web et doit contenir une valeur date/heure. DateModified c'est quand un post est modifié, de sorte qu'il n'a pas à contenir une valeur, mais peut contenir une valeur.

public class BlogPost : Entity
{
     public DateTime DateModified { get; set; }

     public DateTime DatePublished { get; set; }
}

en utilisant ADO.NET pour obtenir les données de la base de données (assignez DateTime.MinValue est-ce qu'il n'y a pas de valeur):

BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? DateTime.MinValue : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);

vous pouvez accomplir mon deuxième point en marquant le champ DateModified comme nullable . Maintenant vous pouvez le définir à null s'il n'y a pas de valeur pour lui:

public DateTime? DateModified { get; set; }

à l'Aide de ADO.NET pour obtenir les données de la base de données, il sera un peu différent de la façon dont il a été fait ci-dessus (en assignant null au lieu de DateTime.MinValue ):

BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? (DateTime?)null : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);

j'espère que cela aidera à dissiper toute confusion. Étant donné que ma réponse est environ 8 ans plus tard vous êtes probablement un expert c # programmeur maintenant :)

-1
répondu Brendan Vogt 2016-07-26 12:47:54