Estive pesquisando muito, mas não consegui encontrar uma solução. Como você lida com um DateTime que deve ser capaz de conter um valor não inicializado (equivalente a nulo)? Eu tenho uma classe que pode ter um valor de propriedade DateTime definido ou não. Eu estava pensando em inicializar o proprietário da propriedade para DateTime.MinValue, que poderia ser verificado facilmente. Eu acho que essa é uma pergunta bastante comum, como você faz isso?
273
DateTime.MinValue
bemMyNullableDate=date;
configurá-lo,MyDate = MyNullableDate.Value;
lê-lo eif(MyNullableDate.HasValue)
verificar se é nulo.Se você estiver usando o .NET 2.0 (ou posterior), poderá usar o tipo anulável:
ou
depois:
E você pode verificar o valor com:
Ou você pode usá-lo como:
Você pode ler mais aqui:
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx
fonte
dt.GetValueOrDefault()
- é a opção mais eficiente.Data hora? MyDateTime {get; set;}
fonte
null
não funciona. Precisa ser(DateTime?)null
.O caminho a seguir também funciona
Observe que a propriedade PublishDate deve ser DateTime?
fonte
Eu consideraria o uso de tipos anuláveis .
DateTime? myDate
em vez deDateTime myDate
.fonte
Vale ressaltar que, embora uma
DateTime
variável não possa sernull
, ainda pode ser comparadanull
sem um erro do compilador:fonte
Você pode usar uma classe anulável.
fonte
DateTime
. Como mencionado anteriormente,new DateTime()
efetivamente lhe daráDateTime.Min
enquantonew DateTime?()
resultará em nulo.Você pode usar um DateTime anulável para isso.
ou a mesma coisa escrita assim:
fonte
Você pode definir o DateTime como Nullable. Por padrão, DateTime não é anulável. Você pode torná-lo anulável de duas maneiras. Usando um ponto de interrogação após o tipo DateTime? myTime ou usando o estilo genérico Nullable.
ou
fonte
Eu sempre defino a hora
DateTime.MinValue
. Dessa forma, não recebo nenhum NullErrorException e posso compará-lo com uma data que sei que não está definida.fonte
Apenas esteja avisado - Ao usar um Nullable, obviamente ele não é mais um objeto de data / hora 'puro'; portanto, você não pode acessar diretamente os membros do DateTime. Vou tentar explicar.
Ao usar Nullable <>, você basicamente envolve o DateTime em um contêiner (obrigado genéricos) cujo valor é anulável - obviamente, seu objetivo. Esse contêiner possui suas próprias propriedades, que você pode chamar, que fornecerão acesso ao objeto DateTime acima mencionado; depois de usar a propriedade correta - neste caso, Nullable.Value - você terá acesso aos membros DateTime, propriedades etc.
Então - agora o problema vem à mente sobre a melhor maneira de acessar o objeto DateTime. Existem algumas maneiras: o número 1 é, de longe, o melhor e 2 é o "cara por que".
Usando a propriedade Nullable.Value,
DateTime date = myNullableObject.Value.ToUniversalTime(); //Works
DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails
Convertendo o objeto anulável em data e hora usando Convert.ToDateTime (),
DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...
Embora a resposta esteja bem documentada neste momento, acredito que provavelmente valha a pena postar sobre o uso do Nullable. Desculpe se você não concorda.
edit: Removida uma terceira opção, pois era um pouco específica demais e dependia de maiúsculas e minúsculas.
fonte
Embora todos já tenham lhe dado a resposta, mencionarei uma maneira que facilita a passagem de um datetime para uma função
[ERRO: não é possível converter system.datetime? para system.datetime]
Agora você pode passar o dte dentro da função sem problemas.
fonte
Se você está, às vezes, esperando nulo, pode usar algo como isto:
No seu repositório, use data e hora que podem ser nulos.
fonte
Eu tive o mesmo problema que eu tive que fornecer Null como parâmetro para DateTime enquanto realizava o teste de unidade para Throws ArgumentNullException. Funcionou no meu caso usando a seguinte opção:
fonte
Dada a natureza de um tipo de dados de data / hora, ele não pode conter um
null
valor, ou seja, precisa conter um valor, não pode ficar em branco ou conter nada. Se você marcar uma variável de data / hora comonullable
somente então, poderá atribuir um valor nulo a ela. Então, o que você está procurando fazer é uma das duas coisas (pode haver mais, mas só consigo pensar em duas):Atribua um valor mínimo de data / hora à sua variável, se você não tiver um valor para ela. Você também pode atribuir um valor máximo de data / hora - da maneira que mais lhe convier. Apenas verifique se você é consistente em todo o site ao verificar seus valores de data / hora. Decida usar
min
oumax
e ficar com ele.Marque sua variável de data / hora como
nullable
. Dessa forma, você pode definir sua variável de data / hora comonull
se você não tiver uma variável.Deixe-me demonstrar meu primeiro ponto usando um exemplo. O
DateTime
tipo de variável não pode ser definido como nulo, ele precisa de um valor; neste caso, eu vou defini-lo como oDateTime
valor mínimo, se não houver valor.Meu cenário é que eu tenho uma
BlogPost
aula. Ele tem muitos campos / propriedades diferentes, mas eu escolhi apenas usar dois para este exemplo.DatePublished
é quando a postagem foi publicada no site e precisa conter um valor de data / hora.DateModified
é quando uma postagem é modificada, para que ela não precise conter um valor, mas pode conter um valor.Usando
ADO.NET
para obter os dados do banco de dados (atribuirDateTime.MinValue
se não há valor):Você pode realizar meu segundo ponto, marcando o
DateModified
campo comonullable
. Agora você pode configurá-lo comonull
se não houver valor para ele:Usando
ADO.NET
para obter os dados do banco de dados, será um pouco diferente da maneira como foi feito acima (atribuindo emnull
vez deDateTime.MinValue
):Espero que isso ajude a esclarecer qualquer confusão. Dado que minha resposta é cerca de 8 anos depois, você provavelmente já é um programador C # experiente :)
fonte