Conversión de formato de fecha y hora con la maquinilla de afeitar

104

¿Qué hay de malo en lo siguiente?

@Convert.ToDateTime((@item.Date.ToShortDateString())," dd - M - yy")

@ item.Date se muestra el 20/11/2005 a las 12:00 a. m. y quiero mostrar el 20 de noviembre de 2011

aprendizaje
fuente
1
Las combinaciones de los distintos especificadores de formato de fecha que existen se pueden encontrar aquí: msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
Joseph Woodward

Respuestas:

264

Tratar:

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

o puede usar el [DisplayFormat]atributo en su modelo de vista:

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

y en su opinión simplemente:

@Html.DisplayFor(x => x.Date)
Darin Dimitrov
fuente
3
Intenté esto con un cuadro de texto y lamentablemente no funcionó. ¿Hay alguna forma de hacer esto para los cuadros de texto?
Tobias
2
Para un cuadro de texto, use EditorFor en lugar de DisplayFor
Brandon シ Renfrow
10
Recuerde establecer "ApplyFormatInEditMode = true" en su definición de DisplayFormat si desea que el formato de fecha se aplique a los elementos EditorFor ().
Desarrollador tardío
1
Necesitaba usar esto para un campo DateTime para usar el selector de fecha incorporado. Sin la anotación DisplayFormat, la consola de JavaScript en el navegador mostraría algo como "El valor especificado '1/1/1990 12:00:00 AM' no se ajusta al formato requerido, 'aaaa-MM-dd'". Tuve que configurar tanto DataFormatString como ApplyFormatInEditMode en verdadero para que el error desapareciera y el valor se mostrara correctamente al usar EditorFor en mi vista MVC.
Mark
Esto funciona para mí, pero no sé: tengo la sensación de que estoy violando la separación de preocupaciones al aplicar lógica para formatear una fecha (una preocupación de presentación) en el modelo a través de un atributo. Entiendo que así es como Microsoft espera que funcione, pero parece que el formato de visualización de datos debería aislarse de la vista y el modelo debería ser solo un modelo.
barrypicker
73

Esta es la solución:

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

Antes de ToString () use Value .

Miroslav Holec
fuente
1
este código es correcto, pero si la columna de fecha es nula, esto arrojará un error, así que intente esto
shaijut
Stom es correcto, si tiene valores nulos le arrojará el error, gracias por el enlace
Nick Kahn
Justo lo que estaba buscando
Roger Tello
La excepción nula se puede manejar mediante el operador de fusión nula - @(item.DOB?.ToString("dd-MMM-yyyy")). O usando la propiedad HasValue - @(item.DataDate.HasValue ? item.DataDate.Value.Date.ToString("dd MMM yyyy") : null). En ambos casos, la propiedad debe ser datetime que admita valores NULL.
cuásar
31

Prueba esto en MVC 4.0

@Html.TextBoxFor(m => m.YourDate, "{0:dd/MM/yyyy}", new { @class = "datefield form-control", @placeholder = "Enter start date..." })
Mella
fuente
2
No sé por qué alguien rechazaría esta respuesta.
Mikayil Abdullayev,
Supongo que el voto negativo se debió a que esta solución formateó la fecha como "dd / MM / aaaa" en lugar del formato "dd MMM aaaa" que solicitó el OP
PTD
1
Esta debería ser la respuesta elegida. Probé los demás y ninguno funcionó. Gracias.
Victor Lee
20

El atributo [DisplayFormat] solo se usa en EditorFor / DisplayFor, y no en las API de HTML sin procesar como TextBoxFor. Lo hice funcionar haciendo lo siguiente,

Modelo:

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

Ver:

        <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>

Salida: 30/12/2011

Enlace relacionado:

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

Diganta Kumar
fuente
1
Alternativamente, también puede usar @ string.Format ("{0: MM aaaa}", imprint.VersionDate)
Diganta Kumar
8

El siguiente código te ayudará

@Html.Label(@item.Date.Value.ToString("dd - M - yy"))
Anjan Kant
fuente
4

Para Razor, coloque el archivo DateTime.cshtml en la carpeta Views / Shared / EditorTemplates. DateTime.cshtml contiene dos líneas y produce un TextBox con una fecha formateada el 11/9/2001.

@model DateTime?
@Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" })
Jules Bartow
fuente
1
Gracias ... no pude conseguir que ninguno de los demás trabajara. ¿C # / Razor ha cambiado tanto a un formato de fecha simple que tiene que pasar por tantas cosas para funcionar? La respuesta más sugerida en Internet: .... ToString ("dd MMM aaaa") nunca me ha funcionado y siempre terminaba metiéndolo en una variable convirtiéndolo en una fecha y luego generando la fecha. Sabía que tenía que haber una sola línea que funcionara en alguna parte.
Anthony Griggs
Anthony Griggs, te siento primo. Me alegra compartir el dolor para que todos salgamos ganando, ¡seis años y medio después!
Jules Bartow
3

En general, el mes escrito se escapa como MMM, el año de 4 dígitos como yyyy, por lo que su cadena de formato debe verse como "dd MMM yyyy".

DateTime.ToString("dd MMM yyyy")
flq
fuente
@ ViewBag.PurchaseInfo.LastPurchaseTime.ToString ("dd.MM.yyyy")
yonexbat
3

No pude hacer que esto funcionara completamente según las sugerencias anteriores. La inclusión de DataTypeAttribute [DataType(DataType.Date)]pareció resolver mi problema, consulte:

Modelo

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

Ver

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

HTH

Fraze
fuente
1

Para toda la solución dada, cuando pruebe esto en un navegador moderno (como FF), y haya configurado el modelo correcto

// 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) se renderizará (el tipo de entrada se establece hasta la fecha según la configuración de fecha en su 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>

Y el navegador mostrará

ingrese la descripción de la imagen aquí

Para solucionar esto, debe cambiar el tipo a texto en lugar de fecha (también si desea usar su calendario personalizado)

@Html.EditorFor(model => model.Start, "{0:dd-MM-yyyy}", new { htmlAttributes = new { @class = "form-control", @type = "text" } })
Bunkerbuster
fuente