Exibir apenas data e nenhuma hora


91

No MVC razor, estou colocando a data atual no banco de dados assim ..

model.Returndate = DateTime.Now.Date.ToShortDateString();

Como o campo de banco de dados é um tipo de dados datetime e estou convertendo a data atual para o formato de string, isso não está funcionando .. como posso fazer isso? Estou fazendo o formato de string porque quero a data no formato mm / dd / aaaa e não no formato mm / dd / aaaa hh: mm: ss.

EDITAR:

No controlador eu tenho

var model = new ViewModel();
model.ReturnDate = DateTime.Now;            
return PartialView("PartialView", model);  

Na visão parcial, eu tenho

@Html.EditorFor(model => model.Returndate)

É aqui que está exibindo a data como Data e Hora juntas ... Eu quero apenas a data a ser exibida. Não é a hora. Espero que esta edição explique melhor.


1
não se preocupe com as 00:00:00 (meia-noite). Basta formatar a saída ToString("mm/dd/yyyy");para poder ver exatamente o que você deseja.
Chase Florell

1
Salve os dados no banco de dados como DateTime. Você faz a formatação da string no OUTPUT ... Apenas formate para o visualizador final.
Chase Florell

Respostas:


96

Se o tipo de coluna for DateTime no SQL, ele armazenará um horário onde você passa um ou não.

Seria melhor salvar a data corretamente:

model.ReturnDate = DateTime.Now;

e, em seguida, formate-o quando precisar exibi-lo:

@Html.Label(Model.ReturnDate.ToShortDateString())

Ou se você estiver usando o EditorFor:

@Html.EditorFor(model => model.ReturnDate.ToShortDateString())

ou

@Html.EditorFor(model => model.ReturnDate.ToString("MM/dd/yyyy"))

Para adicionar uma propriedade ao seu modelo, adicione este código:

public string ReturnDateForDisplay
{
    get
    {
       return this.ReturnDate.ToString("d");
    }
}

Em seguida, em seu PartialView:

@Html.EditorFor(model => model.ReturnDateForDisplay)

EDITAR:

Olá pessoal, só quero esclarecer para esta resposta que, ao dizer 'Se você estiver usando EditorFor', significa que você precisa ter um modelo EditorFor para o tipo de valor que está tentando representar.

Modelos de editor são uma maneira legal de gerenciar controles repetitivos em MVC:

http://coding-in.net/asp-net-mvc-3-how-to-use-editortemplates/

Você pode usá-los para tipos ingênuos como String, como fiz acima; mas eles são especialmente ótimos para permitir que você modele um conjunto de campos de entrada para um tipo de dados mais complicado.


não tenho certeza de quem votou contra isso .. mas não estou usando o HTML.label para exibir isso .. Estou usando HTML.EditorFor (model => model.Returndate) como faço para formatar a exibição neste caso ...
ZVenue de

Esse foi apenas um exemplo de como formatar seu resultado; Vou atualizar minha resposta.
Russ Clarke

14
@Russ: o editor de atualização que você fez não funcionou. Ele está me dando um erro "Os modelos podem ser usados ​​apenas com acesso a campo, acesso de propriedade, índice de matriz de dimensão única ou expressões de indexador personalizadas de parâmetro único."
ZVenue de

1
Vou adicioná-lo à minha resposta
Russ Clarke

19
você deve remover '@ Html.EditorFor (model => model.ReturnDate.ToShortDateString ())' da resposta porque isso não funciona.
James Reategui

129

Só tive que lidar com este cenário sozinho - encontrei uma maneira realmente fácil de fazer isso, basta anotar sua propriedade no modelo assim:

[DataType(DataType.Date)]
public DateTime? SomeDateProperty { get; set; }

Ele também ocultará o botão de hora do selecionador de data.

Desculpe se esta resposta está um pouco atrasada;)


Muito obrigado. Foi uma postagem muito útil para mim! +1
Dmytro

1
Exatamente o que eu precisava. Excelente!
RealityDysfunction de

1
Tive uma sessão recentemente em que o Chrome colocou coisas engraçadas quando o tipo de entrada é data, parte do html5 eu acho, eu queria usar o jquery datepicker em vez disso, então optei pelo DataType.Text - que ainda me permitiu usar uma formatação legal o suficiente
John

2
Não há necessidade de se desculpar pelo atraso, postar respostas a perguntas antigas pode ser uma grande ajuda para pessoas que não são OP. Essa é a resposta que eu procurava porque sabia que era possível, mas não conseguia lembrar como, e você a postou há 3 anos. Se qualquer coisa, você está incrivelmente adiantado.
RyanfaeScotland

se a data vier de um banco de dados, não sei como isso poderia ajudar ... não consigo descobrir
Antoine Pelletier

41

Isso funciona se você deseja exibir em um TextBox:

@Html.TextBoxFor(m => m.Employee.DOB, "{0:dd-MM-yyyy}")

a data será exibida incorretamente se o navegador tiver um formato diferente nas configurações de "dd-MM-aaaa", ou seja, "MM-dd-aaaa"
Oleg Sh

16

A data / hora na base de dados não será uma versão formatada . Será apenas a própria data / hora. Como você exibe essa data / hora ao extrair o valor do banco de dados é uma questão diferente. Suspeito fortemente que você realmente só deseja:

model.Returndate = DateTime.Now.Date;

ou possivelmente

model.Returndate = DateTime.UtcNow.Date;

Sim, se você olhar para o banco de dados usando SQL Server Studio ou qualquer outro, você verá agora a meia-noite - mas isso é irrelevante, e quando você busca a data do banco de dados e exibe para um usuário, então você pode aplicar o formato relevante .

EDITAR: Em relação à sua pergunta editada, o problema não é com o modelo - é como você especifica a visualização. Você deve usar algo como:

@Html.EditorFor(model => model.Returndate.Date.ToString("d"))

onde dé o especificador de formato de data e hora padrão para o padrão de data abreviada (o que significa que ele levará as configurações culturais atuais em consideração).

Essa é a parte que venho dizendo repetidamente - que quando você exibe a data / hora para o usuário , é a hora de formatá-la como uma data sem hora.

EDIT: Se isso não funcionar, deve haver uma maneira de decorar o modelo ou visualização com uma string de formato - ou algo parecido. Não sou realmente uma pessoa MVC, mas parece que deve haver uma boa maneira de fazer isso declarativamente ...


O DateTime.Now.Date ainda exibe a hora junto com a data.
ZVenue de

1
@ZVenue: Exibe onde? Você deve armazenar um valor DateTime e usar um especificador de formato apenas de data sempre que estiver exibindo a data. O código que você forneceu (definindo uma propriedade no modelo) é presumivelmente para armazenamento, então não importa que seja meia-noite.
Jon Skeet

Jon está sugerindo o que eu estava falando, salvando a data no SQL como está; você pode então formatar sua data apropriadamente ao imprimi-la.
Russ Clarke

2
@Jon: Estou recebendo este erro quando usei seu código de edição para html.editorfor .... "Os modelos podem ser usados ​​apenas com acesso a campo, acesso de propriedade, índice de matriz de dimensão única ou expressões de indexador personalizadas de parâmetro único". ... em tempo de execução
ZVenue

1
@ZVenue: Dê uma olhada nisso também: stackoverflow.com/questions/5033902/…
Jon Skeet

8

Você pode modificar seu ViewModel conforme abaixo:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}",ApplyFormatInEditMode = true)]

Esta solução também resolve o problema do conflito do selecionador de data do Chrome. Se você apenas especificar Datatype.Date em Viewmodel, o Chrome usa sua própria versão do datepicker na caixa de texto. Obrigado!
Katherine

7

Você pode aplicar o formato de data e hora personalizado usando ToStringcomo:

DateTime.Now.Date.ToString("MM/dd/yyyy");

Leituras adicionais sobre o DateTime.ToStringpadrão de formatos podem ser encontradas aqui e aqui .

Editar: Após a edição da sua pergunta, assim como o outro sugeriu, você deve aplicar o formato de data em sua visualização:

model.Returndate = DateTime.Now.Date;

@Html.EditorFor(model => model.Returndate.Date.ToString("MM/dd/yyyy"))

1
isso não ajudará na questão de salvar a data.
Russ Clarke

Ele não pode economizar chamando model.Returndate.ToString("mm/dd/yyyy")?
Jalal Said

Isso é um problema .. Estou colocando esse valor em um campo datetime no banco de dados. Então isso não vai funcionar ... por favor, veja meu post original.
ZVenue de

Não deveria ser .ToString ("MM / dd / aaaa")? mm são minutos, não meses!
Bodrick

@Bodrich: obrigado, atualizado, no entanto, acabei de copiar e colar o padrão dele.
Jalal Said

4

Não tenho certeza no Razor, mas no ASPX você faz:

 <%if (item.Modify_Date != null)
  {%>
     <%=Html.Encode(String.Format("{0:D}", item.Modify_Date))%>     
<%} %>

Deve haver algo semelhante no Razor. Espero que isso ajude alguém.


1
Sim, isso também funcionaria na sintaxe do Razor, por exemplo, @ Html.Encode (string.Format ("0: D", item.Modify_Date))
Ciaran Gallagher

4

Se você tiver um loop for, como o abaixo.

Altere @ item.StartDate para @ item.StartDate.Value.ToShortDateString ()

Isso removerá o tempo caso você não consiga anotar sua propriedade no modelo como no meu caso.

<table>
  <tr>
   <th>Type</th>
   <th>Start Date</th>
  </tr>
    @foreach (var item in Model.TestList) {
      <tr>
        <td>@item.TypeName</td>
        <td>@item.StartDate.Value.ToShortDateString()</td>
      </tr>
      }
</table>

2

Inclua anotações de dados como DisplayFormat e ApplyFormatInEditMode para obter a saída desejada.

[Display(Name = "Bill Date")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] public DateTime BillDate { get; set; }

Agora sua data de faturamento aparecerá como.

insira a descrição da imagem aqui


Por favor, dê uma olhada nas outras respostas. Você acha que o seu é necessário e adiciona algum conteúdo novo de qualidade ao post?
L. Guthardt

1

Você pode simplesmente converter a data e hora. Algo como:

@Convert.ToString(string.Format("{0:dd/MM/yyyy}", Model.Returndate))

1

Tive alguns problemas com as outras soluções desta página, por isso pensei em deixar isso aqui.

@Html.TextBoxFor(m => m.EndDate, "{0:d}", new { @class = "form-control datepicker" })

Portanto, você só precisa adicionar "{0: d}" no segundo parâmetro e pronto.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.