Convertendo o formato DateTime usando o razor


Respostas:


264

Experimentar:

@item.Date.ToString("dd MMM yyyy")

ou você pode usar o [DisplayFormat]atributo em seu modelo de visualização:

[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}")]
public DateTime Date { get; set }

e na sua visão simplesmente:

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

3
Tentei fazer isso com uma caixa de texto e, infelizmente, não funcionou. Existe uma maneira de fazer isso para caixas de texto?
Tobias

2
Para uma caixa de texto, use EditorFor em vez de DisplayFor
Brandon シ Renfrow

10
Lembre-se de definir "ApplyFormatInEditMode = true" em sua definição DisplayFormat se desejar que a formatação de data seja aplicada aos elementos EditorFor ().
Latedeveloper

1
Eu precisava usar isso para um campo DateTime a fim de usar o seletor de data integrado. Sem a anotação DisplayFormat, o console javascript no navegador mostraria algo como "O valor especificado '1/1/1990 12:00:00 AM' não está em conformidade com o formato exigido, 'aaaa-MM-dd'." Tive que definir DataFormatString e ApplyFormatInEditMode como true para que o erro desaparecesse e o valor fosse exibido corretamente ao usar EditorFor em minha visualização MVC.
Mark

Isso funciona para mim, mas não sei - tenho a sensação de que estou violando a separação de interesses ao aplicar lógica para formatar uma data (um problema de apresentação) no modelo por meio de um atributo. Eu entendo que é assim que a Microsoft espera que funcione, mas parece que a formatação de exibição de dados deve ser isolada para a exibição e o modelo deve ser apenas um modelo.
barrypicker

73

Esta é a solução:

@item.Published.Value.ToString("dd. MM. yyyy")

Antes de ToString (), use Value .


1
este código está correto, mas se a coluna de data for nula, isso gerará um erro, então tente isto
shaijut

Stom está correto, se você tiver valores nulos irá gerar o erro, obrigado pelo link
Nick Kahn

Exatamente o que eu estava procurando
Roger Tello

A exceção nula pode ser tratada usando o operador de coalescência nulo - @(item.DOB?.ToString("dd-MMM-yyyy")). Ou usando a propriedade HasValue - @(item.DataDate.HasValue ? item.DataDate.Value.Date.ToString("dd MMM yyyy") : null). Em ambos os casos, a propriedade deve ser datetime anulável.
quasar

31

Experimente isso no MVC 4.0

@Html.TextBoxFor(m => m.YourDate, "{0:dd/MM/yyyy}", new { @class = "datefield form-control", @placeholder = "Enter start date..." })

2
Não sei por que alguém iria negar essa resposta.
Mikayil Abdullayev

Eu presumiria que o downvote foi devido a esta solução formatando a data como "dd / MM / aaaa" em vez do formato "dd MMM aaaa" que o OP solicitou
PTD

1
Esta deve ser a resposta escolhida. Tentei os outros e nenhum funcionou. THX.
Victor Lee

20

O atributo [DisplayFormat] é usado apenas em EditorFor / DisplayFor, e não pelas APIs HTML brutas como TextBoxFor. Eu consegui fazer o seguinte,

Modelo:

[Display(Name = "When was that document issued ?")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime? LiquorLicenceDocumentIssueDate { get; set; }

Visão:

        <div id="IsLiquorLicenceDocumentOnPremisesYes" class="groupLongLabel">
            @Html.LabelFor(m => m.LiquorLicenceDocumentIssueDate)
            <span class="indicator"></span>
            @Html.EditorFor(m => m.LiquorLicenceDocumentIssueDate)
            <span id="validEmail"></span>
            <br />
            @Html.ValidationMessageFor(m => m.LiquorLicenceDocumentIssueDate)
        </div>

Saída: 30/12/2011

Link relacionado:

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayformatattribute.applyformatineditmode.aspx


1
Como alternativa, você também pode usar @ string.Format ("{0: MM yyyy}", imprint.VersionDate)
Diganta Kumar

8

O código abaixo irá ajudá-lo

@Html.Label(@item.Date.Value.ToString("dd - M - yy"))

4

Para o Razor coloque o arquivo DateTime.cshtml na pasta Views / Shared / EditorTemplates. DateTime.cshtml contém duas linhas e produz um TextBox com uma data formatada 11/09/2001.

@model DateTime?
@Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" })

1
Obrigado ... não consegui fazer nenhum dos outros trabalhar. C # / Razor mudou tanto para um formato de data simples que precisa passar por tantas coisas para funcionar? A resposta mais sugerida na internet: .... ToString ("dd MMM aaaa") nunca funcionou para mim e eu sempre acabava colocando-o em uma variável, convertendo-o em uma data e depois gerando a data. Eu sabia que devia haver um forro que funcionasse em algum lugar.
Anthony Griggs

Anthony Griggs, eu sinto você primo. Fico feliz em compartilhar a dor para que todos possamos ganhar - 6 anos e meio depois!
Jules Bartow

3

Em geral, o mês escrito tem escape como MMM, o ano de 4 dígitos como aaaa, então sua string de formato deve ser semelhante a "dd MMM aaaa"

DateTime.ToString("dd MMM yyyy")

@ ViewBag.PurchaseInfo.LastPurchaseTime.ToString ("dd.MM.yyyy")
yonexbat

3

Não consegui fazer isso funcionar inteiramente com base nas sugestões acima. Incluindo o DataTypeAttribute[DataType(DataType.Date)] pareceu resolver meu problema, consulte:

Modelo

[Required]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
public DateTime RptDate { get; set; }

Visão

@Html.EditorFor(m => m.CLPosts.RptDate)

HTH


1

Para todas as soluções fornecidas, quando você tenta isso em um navegador moderno (como o FF), e você configurou o modelo correto

// Model
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
public DateTime Start { get; set; }

// View
<div class="form-group">
    @Html.LabelFor(model => model.Start, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.Start, "{0:dd-MM-yyyy}", new { htmlAttributes = new { @class = "form-control"} })
    </div>
</div>

mvc (5) irá renderizar (o tipo de entrada é definido para a data com base nas configurações de data em seu modelo!)

<div class="col-md-10">
<input class="form-control text-box single-line" data-val="true" data-val-date="The field Start must be a date." data-val-required="The Start field is required." id="Start" name="Start" value="01-05-2018" type="date">
        <span class="field-validation-valid text-danger" data-valmsg-for="Start" data-valmsg-replace="true"></span>
</div>

E o navegador mostrará

insira a descrição da imagem aqui

Para corrigir isso, você precisa alterar o tipo para texto em vez de data (também se quiser usar seu calendário personalizado)

@Html.EditorFor(model => model.Start, "{0:dd-MM-yyyy}", new { htmlAttributes = new { @class = "form-control", @type = "text" } })
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.