Como renderizar um DateTime em um formato específico no ASP.NET MVC 3?

Se eu tenho na minha class de modelo uma propriedade do tipo DateTime como posso processá-lo em um formato específico – por exemplo, no formato que ToLongDateString() retorna?

Eu tentei isso …

 @Html.DisplayFor(modelItem => item.MyDateTime.ToLongDateString()) 

… que lança uma exceção porque a expressão deve apontar para uma propriedade ou campo. E isto…

 @{var val = item.MyDateTime.ToLongDateString(); Html.DisplayFor(modelItem => val); } 

… que não lança uma exceção, mas a saída renderizada está vazia (embora val contenha o valor esperado, como eu pude ver no depurador).

Obrigado por dicas antecipadamente!

Editar

ToLongDateString é apenas um exemplo. O que eu realmente quero usar em vez de ToLongDateString é um método de extensão personalizada de DateTime e DateTime? :

 public static string FormatDateTimeHideMidNight(this DateTime dateTime) { if (dateTime.TimeOfDay == TimeSpan.Zero) return dateTime.ToString("d"); else return dateTime.ToString("g"); } public static string FormatDateTimeHideMidNight(this DateTime? dateTime) { if (dateTime.HasValue) return dateTime.Value.FormatDateTimeHideMidNight(); else return ""; } 

Portanto, acho que não posso usar o atributo DisplayFormat e o parâmetro DataFormatString nas propriedades do ViewModel.

Se tudo o que você quiser fazer é exibir a data com um formato específico, basta ligar:

 @String.Format(myFormat, Model.MyDateTime) 

O uso de @Html.DisplayFor(...) é apenas um trabalho extra, a menos que você esteja especificando um modelo ou precise usar algo criado em modelos, como iterar um IEnumerable . Criar um modelo é bastante simples e pode fornecer muita flexibilidade também. Crie uma pasta na sua pasta de exibições para o controlador atual (ou pasta de exibições compartilhadas) chamada DisplayTemplates . Dentro dessa pasta, adicione uma vista parcial com o tipo de modelo para o qual você deseja construir o modelo. Neste caso eu adicionei /Views/Shared/DisplayTemplates e adicionei uma visão parcial chamada ShortDateTime.cshtml .

 @model System.DateTime @Model.ToShortDateString() 

E agora você pode chamar esse modelo com a seguinte linha:

 @Html.DisplayFor(m => m.MyDateTime, "ShortDateTime") 

Você pode decorar a propriedade do modelo de exibição com o atributo [DisplayFormat] :

 [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] public DateTime MyDateTime { get; set; } 

e na sua opinião:

 @Html.EditorFor(x => x.MyDate) 

ou, para exibir o valor,

 @Html.DisplayFor(x => x.MyDate) 

Outra possibilidade, que não recomendo, é usar um auxiliar de tipo fraco:

 @Html.TextBox("MyDate", Model.MyDate.ToLongDateString()) 

Saída formatada simples dentro do modelo

 @String.Format("{0:d}", model.CreatedOn) 

ou no loop foreach

 @String.Format("{0:d}", item.CreatedOn) 

Eu uso a seguinte abordagem para o formato in-line e exibo uma propriedade de data do modelo.

 @Html.ValueFor(model => model.MyDateTime, "{0:dd/MM/yyyy}") 

Caso contrário, ao preencher um TextBox ou Editor você poderia fazer como @Darin sugeriu, decorou o atributo com um atributo [DisplayFormat] .

Se todos os seus tipos DateTime forem renderizados da mesma maneira, você poderá usar um modelo de exibição DateTime personalizado.

Na sua pasta Views, crie uma pasta chamada “DisplayTemplates” na pasta de visualizações específicas do controlador ou na pasta “Shared” (que funciona de maneira semelhante a partials).

Dentro de criar um arquivo chamado DateTime.cshtml que leva DateTime como o @model e codificar como você deseja processar sua data:

 @model System.DateTime @Model.ToLongDateString() 

Agora você pode usar isso em suas visualizações e deve funcionar:

 @Html.DisplayFor(mod => mod.MyDateTime) 

Contanto que você siga a convenção de adicioná-lo à pasta “DisplayTemplates” e nomear o arquivo para corresponder ao tipo que está sendo exibido, o MVC usará isso automaticamente para exibir seus valores. Isso também funciona para editar cenários usando “EditorTemplates”.

Veja mais algumas informações sobre modelos .

Minha preferência é manter os detalhes de formatação com a visualização e não com o viewmodel. Então, no MVC4 / Razor:

 @Html.TextBoxFor(model => model.DateTime, "{0:d}"); 

referência de formato datetime: http://msdn.microsoft.com/pt-br/library/az4se3k1(v=vs.71).aspx

Então eu tenho um datepicker JQuery ligado a ele, e que colocar a data em um formato diferente … doh!

Parece que preciso definir o formato do criador de data para a mesma formatação.

Então, eu estou armazenando a formatação System.Globalization em um atributo data- * e coletando-o ao configurar o

 @Html.TextBoxFor( model => model.DateTime.Date, "{0:d}", new { @class = "datePicker", @data_date_format=System.Globalization.CultureInfo .CurrentUICulture.DateTimeFormat.ShortDatePattern })); 

E aqui está a parte sucinta: os formatos de .net e datepicker não correspondem, então hackery é necessário:

 $('.datePicker').each(function(){ $(this).datepicker({ dateFormat:$(this).data("dateFormat").toLowerCase().replace("yyyy","yy") }); }); 

isso é meio fraco, mas deve cobrir muitos casos.

funciona para mim

 < %=Model.MyDateTime.ToString("dd-MMM-yyyy")%> 

Tive o mesmo problema recentemente.

Descobri que simplesmente definir DataType como Data no modelo também funciona (usando a abordagem Code First)

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

você pode fazer assim @item.Date.Value.Tostring("dd-MMM-yy");

se eu quiser apenas exibir a data no formato curto eu apenas uso @ Model.date.ToShortDateString () e imprime a data em

Se tudo o que você quiser fazer é exibir a data com um formato específico, basta ligar:

 @Model.LeadDate.ToString("dd-MMM-yyyy") @Model.LeadDate.ToString("MM/dd/yy") 

Isso resultará no seguinte formato,

 26-Apr-2013 04/26/13 

isso será exibido no formato dd/MM/yyyy na sua Visualização

Em vista:

em vez de DisplayFor use este código

  @(item.Startdate.HasValue ? item.Startdate.Value.ToString("dd/MM/yyyy") : "Date is Empty")  

ele também verifica se o valor é nulo na coluna date, se true, exibirá Data está vazia ou a data formatada real da coluna.

Esperança ajuda alguém.

 @{ string datein = Convert.ToDateTime(item.InDate).ToString("dd/MM/yyyy"); @datein } 

Em MVC5 eu usaria, se seu modelo é o datetime

 string dt = Model.ToString("dd/MM/yyy"); 

Ou se o seu modelo contiver a propriedade do datetime

 string dt = Model.dateinModel.ToString("dd/MM/yyy"); 

Aqui está o significado oficial dos formatos:

https://msdn.microsoft.com/pt-br/library/8kb3ddd4(v=vs.110).aspx

Apenas Visualizar Arquivo Ajustar como este. Você pode tentar isso.

 @Html.FormatValue( (object)Convert.ChangeType(item.transdate, typeof(object)), "{0: yyyy-MM-dd}") 

item.transdate são os dados do tipo DateTime .