net convertir asp asignar c# datetime null

convertir - get datetime c# null



DateTime "null" valor (15)

He estado buscando mucho pero no pude encontrar una solución. ¿Cómo lidiar con un DateTime que debería poder contener un valor no inicializado (equivalente a nulo)? Tengo una clase que puede tener un valor de propiedad DateTime establecido o no. Estaba pensando en inicializar el propietario 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?


¿Fecha y hora? MyDateTime {get; set;}

MyDateTime = (drOrder["Field1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)drOrder["Field1"]);


Aunque todos ya le han dado la respuesta, mencionaré una forma que facilita el paso de una fecha a una función

[ERROR: no se puede convertir system.datetime? a system.datetime]

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

Ahora puede pasar dte dentro de la función sin problemas.


Dada la naturaleza de un tipo de datos de fecha / hora, no puede contener un valor null , es decir, debe contener un valor, no puede estar en blanco ni contener nada. Si marca una variable de fecha / hora como nullable , solo podrá asignarle un valor nulo. Entonces, lo que estás buscando 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, según le convenga. Solo asegúrese de que es consistente en todo el sitio al verificar sus valores de fecha / hora. Decidir sobre el uso de min o max y seguir con él.

  • Marque su variable de fecha / hora como nullable . De esta manera, puede establecer su variable de fecha / hora en null si no tiene una variable.

Déjame demostrar mi primer punto usando un ejemplo. El tipo de variable DateTime no se puede establecer en nulo, necesita un valor, en este caso lo estableceré en el valor mínimo de DateTime si no hay ningún valor.

Mi escenario es que tengo una clase BlogPost . Tiene muchos campos / propiedades diferentes, pero elegí usar solo dos para este ejemplo. DatePublished es cuando la publicación se publicó en el sitio web y debe contener un valor de fecha / hora. DateModified es cuando se modifica una publicación, por lo que no tiene que contener un valor, pero puede contener un valor.

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

Usar ADO.NET para obtener los datos de la base de datos (asigne DateTime.MinValue no hay ningún valor):

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

Puede lograr mi segundo punto marcando el campo DateModified como nullable . Ahora puede establecerlo en null si no tiene ningún valor:

public DateTime? DateModified { get; set; }

Usando ADO.NET para obtener los datos de la base de datos, se verá un poco diferente a la forma en que se hizo anteriormente (asignando null lugar de DateTime.MinValue ):

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

Espero que esto ayude a aclarar cualquier confusión. Dado que mi respuesta es aproximadamente 8 años más tarde, probablemente ya sea un experto programador en C # :)


De esa manera trabajando tambien

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

Tenga en cuenta que la propiedad PublishDate debe ser DateTime?


Puede establecer el DateTime en Nullable. Por defecto, DateTime no es anulable. Puedes hacerlo anulable de dos maneras. ¿Usando un signo de interrogación después del tipo DateTime? myTime o usando el estilo genérico Nullable. He añadido un par de enlaces en msdn.

Usando Nullable

Anulable


Puede utilizar un DateTime anulable para esto.

Nullable<DateTime> myDateTime;

o lo mismo escrito así:

DateTime? myDateTime;


Puedes usar una clase anulable.

DateTime? date = new DateTime?();


Si a veces esperas nulo, puedes usar algo como esto:

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

En su repositorio use datetime capaz de anular.

public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...}


Si está utilizando .NET 2.0 (o posterior), puede usar el tipo anulable:

DateTime? dt = null;

o

Nullable<DateTime> dt = null;

Entonces despúes:

dt = new DateTime();

Y puedes comprobar el valor con:

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

O puedes usarlo como:

DateTime dt2 = dt ?? DateTime.MinValue;

Puede leer más aquí:
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx


Siempre establezco la hora en DateTime.MinValue . De esta manera no obtengo ninguna excepción NullErrorException y puedo compararla con una fecha que sé que no está establecida.


Solo tenga cuidado: cuando use un Nullable, obviamente ya no es un objeto datetime ''puro'', por lo que no puede acceder directamente a los miembros de DateTime. Voy a tratar de explicar.

Al utilizar Nullable <> básicamente envuelve DateTime en un contenedor (gracias a los genéricos) del cual es anulable, obviamente su propósito. Este contenedor tiene sus propias propiedades a las que puede llamar y que proporcionarán acceso al objeto DateTime mencionado anteriormente; después de usar la propiedad correcta, en este caso Nullable.Value, tendrá acceso a los miembros de DateTime estándar, propiedades, etc.

Entonces, ahora el problema viene a la mente en cuanto a la mejor manera de acceder al objeto DateTime. Hay algunas maneras, el número 1 es, por mucho, el mejor y el 2 es "tío, por qué".

  1. Usando la propiedad Nullable.Value,

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

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

  2. Convertir el objeto anulable a datetime utilizando Convert.ToDateTime (),

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

Aunque la respuesta está bien documentada en este momento, creo que vale la pena publicar el uso de Nullable. Lo siento si no está de acuerdo.

Editar: Se eliminó una tercera opción, ya que era un poco demasiado específica y dependía del caso.


Tuve el mismo problema que tuve para dar Null como parámetro para DateTime mientras realizaba la prueba unitaria para la excepción ArgumentNullException de Throws. Funcionó en mi caso con la siguiente opción:

Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null));


Vale la pena señalar que, si bien una variable DateTime no puede ser null , aún puede compararse con null sin un error de compilación:

DateTime date; ... if(date == null) // <-- will never be ''true'' ...


Yo consideraría el uso de tipos anulables .

DateTime? myDate DateTime? myDate lugar de DateTime myDate .


Para los DateTimes normales, si no los inicializa, coincidirán con DateTime.MinValue , porque es un tipo de valor en lugar de un tipo de referencia.

También puede utilizar un DateTime anulable, como este:

DateTime? MyNullableDate;

O la forma más larga:

Nullable<DateTime> MyNullableDate;

Y, finalmente, hay una forma integrada de hacer referencia al valor predeterminado de cualquier tipo. Esto devuelve null para los tipos de referencia, pero para nuestro ejemplo DateTime, devolverá lo mismo que DateTime.MinValue :

default(DateTime)