He estado buscando mucho pero no pude encontrar una solución. ¿Cómo manejas un DateTime que debería poder contener un valor no inicializado (equivalente a nulo)? Tengo una clase que podría tener un valor de propiedad DateTime establecido o no. Estaba pensando en inicializar el titular de la propiedad a DateTime.MinValue, que luego podría verificarse fácilmente. Supongo que esta es una pregunta bastante común, ¿cómo haces eso?
273

DateTime.MinValue, asíMyNullableDate=date;que configurarlo,MyDate = MyNullableDate.Value;leerlo yif(MyNullableDate.HasValue)verificar si es nuloSi está utilizando .NET 2.0 (o posterior) puede usar el tipo anulable:
o
Entonces despúes:
Y puede verificar el valor con:
O puedes usarlo como:
Puede leer más aquí:
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx
fuente
dt.GetValueOrDefault(), es la opción más eficiente.¿Fecha y hora? MyDateTime {get; set;}
fuente
nullno funciona. Tiene que ser(DateTime?)null.Seguir el camino también funciona
Tenga en cuenta que la propiedad PublishDate debe ser DateTime?
fuente
Consideraría usar un tipo anulable .
DateTime? myDateen lugar deDateTime myDate.fuente
Vale la pena señalar que, si bien una
DateTimevariable no puede sernull, todavía se puede compararnullsin un error del compilador:fuente
Puede usar una clase anulable.
fuente
DateTime. Como se mencionó anteriormente,new DateTime()efectivamente le dará,DateTime.Minmientras quenew DateTime?()dará como resultado nulo.Puede usar un DateTime anulable para esto.
o lo mismo escrito así:
fuente
Puede establecer DateTime en Nullable. Por defecto, DateTime no es anulable. Puede hacerlo anulable de varias maneras. ¿Usa un signo de interrogación después del tipo DateTime? myTime o usando el estilo genérico Nullable.
o
fuente
Siempre pongo el tiempo para
DateTime.MinValue. De esta forma no obtengo ninguna NullErrorException y puedo compararla con una fecha que sé que no está establecida.fuente
Solo se advirtió: cuando se utiliza un Nullable, obviamente ya no es un objeto de fecha y hora "puro", como tal, no puede acceder directamente a los miembros de DateTime. Trataré de explicarlo.
Al usar Nullable <> básicamente está envolviendo DateTime en un contenedor (gracias genéricos) de los cuales es anulable, obviamente su propósito. Este contenedor tiene sus propias propiedades a las que puede llamar que proporcionarán acceso al objeto DateTime mencionado anteriormente; después de usar la propiedad correcta, en este caso Nullable.Value, tiene acceso a los miembros estándar de DateTime, propiedades, etc.
Entonces, ahora me viene a la mente la mejor forma de acceder al objeto DateTime. Hay algunas maneras, el número 1 es, con diferencia, el mejor y el 2 es "amigo por qué".
Usando la propiedad Nullable.Value,
DateTime date = myNullableObject.Value.ToUniversalTime(); //WorksDateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, failsConvirtiendo el objeto anulable a datetime usando Convert.ToDateTime (),
DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...Aunque la respuesta está bien documentada en este punto, creo que probablemente valga la pena publicar el uso de Nullable. Lo siento si no estás de acuerdo.
editar: se eliminó una tercera opción, ya que era un poco demasiado específica y dependía de mayúsculas y minúsculas.
fuente
Aunque todos ya le han dado la respuesta, mencionaré una forma que facilita pasar una fecha y hora a una función
[ERROR: no se puede convertir system.datetime? a system.datetime]
Ahora puede pasar dte dentro de la función sin ningún problema.
fuente
Si, a veces, espera nulo, podría usar algo como esto:
En su repositorio use datetime nulo.
fuente
Tuve el mismo problema que tuve que darle a Null como parámetro para DateTime mientras realizaba la prueba de unidad para Throws ArgumentNullException. Funcionó en mi caso usando la siguiente opción:
fuente
Dada la naturaleza de un tipo de datos de fecha / hora, no puede contener un
nullvalor, es decir, debe contener un valor, no puede estar en blanco o no contener nada. Si marca una variable de fecha / hora comonullablesolo entonces puede asignarle un valor nulo. Entonces, lo que está buscando hacer es una de dos cosas (puede haber más, pero solo puedo pensar en dos):Asigne un valor mínimo de fecha / hora a su variable si no tiene un valor para ella. También puede asignar un valor máximo de fecha / hora, de la forma que más le convenga. Solo asegúrese de ser consistente en todo el sitio cuando verifique sus valores de fecha / hora. Decide usar
minomaxy quédate con él.Marque su variable de fecha / hora como
nullable. De esta manera, puede establecer su variable de fecha / horanullsi no tiene una variable.Permítanme demostrar mi primer punto usando un ejemplo. El
DateTimetipo de variable no se puede establecer en nulo, necesita un valor, en este caso voy a establecerlo en elDateTimevalor mínimo si no hay ningún valor.Mi escenario es que tengo una
BlogPostclase. Tiene muchos campos / propiedades diferentes, pero elegí solo usar dos para este ejemplo.DatePublishedes cuando la publicación se publicó en el sitio web y debe contener un valor de fecha / hora.DateModifiedes cuando se modifica una publicación, por lo que no tiene que contener un valor, pero puede contener un valor.Utilizando
ADO.NETpara obtener los datos de la base de datos (asignarDateTime.MinValuees que no hay valor):Puedes lograr mi segundo punto marcando el
DateModifiedcampo comonullable. Ahora puede configurarlonullsi no tiene ningún valor:Utilizando
ADO.NETpara obtener los datos de la base de datos, se verá un poco diferente a la forma en que se hizo anteriormente (asignando ennulllugar deDateTime.MinValue):Espero que esto ayude a aclarar cualquier confusión. Dado que mi respuesta es aproximadamente 8 años después, probablemente ya seas un programador experto de C # :)
fuente