Mostrar solo la fecha y no la hora

91

En MVC razor, estoy poniendo la fecha actual en la base de datos de esta manera.

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

Dado que el campo de la base de datos es un tipo de datos de fecha y hora y estoy convirtiendo la fecha actual a formato de cadena, esto no funciona ... ¿cómo puedo hacer esto? Estoy haciendo el formato de cadena porque quiero la fecha en formato mm / dd / aaaa y no en mm / dd / aaaa hh: mm: formato de hora ss.

EDITAR:

En el controlador tengo

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

En la vista parcial, tengo

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

Aquí es donde se muestra la fecha como Fecha y Hora juntas ... Quiero que se muestre solo la fecha. No es el momento. Espero que esta edición se explique mejor.

ZVenue
fuente
1
no se preocupe por las 00:00:00 (medianoche). Simplemente formatee la salida ToString("mm/dd/yyyy");para poder ver exactamente lo que desea.
Chase Florell
1
Guarde los datos en la base de datos como DateTime. Usted hace el formato de cadena en la SALIDA ... Solo formatee en el visor final.
Chase Florell

Respuestas:

96

Si el tipo de columna es DateTime en SQL, almacenará una hora en la que pase una o no.

Sería mejor guardar la fecha correctamente:

model.ReturnDate = DateTime.Now;

y luego formatee cuando necesite mostrarlo:

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

O si está utilizando EditorFor:

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

o

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

Para agregar una propiedad a su modelo, agregue este código:

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

Luego, en su PartialView:

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

EDITAR:

Hola chicos, solo quiero aclarar para esta respuesta que al decir 'Si está usando EditorFor', eso significa que necesita tener una plantilla EditorFor para el tipo de valor que está tratando de representar.

Las plantillas de editor son una forma genial de administrar controles repetitivos en MVC:

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

Puede usarlos para tipos ingenuos como String como lo hice anteriormente; pero son especialmente excelentes para permitirle crear una plantilla de un conjunto de campos de entrada para un tipo de datos más complicado.

Russ Clarke
fuente
No estoy seguro de quién votó en contra de esto ... pero no estoy usando HTML.label para mostrar esto ... Estoy usando HTML.EditorFor (model => model.Returndate) ¿cómo formateo la pantalla en este caso ...
ZVenue
Ese fue solo un ejemplo de cómo dar formato a su resultado; Actualizaré mi respuesta.
Russ Clarke
14
@Russ: el editor de actualización que hizo no funcionó. Me está dando un error "Las plantillas se pueden usar solo con acceso a campo, acceso a propiedad, índice de matriz de una dimensión o expresiones de indexación personalizadas de un solo parámetro".
ZVenue
1
Lo agregaré a mi respuesta
Russ Clarke
19
debe eliminar '@ Html.EditorFor (model => model.ReturnDate.ToShortDateString ())' de la respuesta porque eso no funciona.
James Reategui
129

Solo tuve que lidiar con este escenario yo mismo; encontré una manera realmente fácil de hacer esto, simplemente anote su propiedad en el modelo de esta manera:

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

También ocultará el botón de hora del selector de fecha.

Lo siento si esta respuesta es un poco tarde;)

Dave perezoso
fuente
Muchas gracias. ¡Fue una publicación muy útil para mí! +1
Dmytro
1
Justo lo que necesitaba. ¡Excelente!
RealityDysfunction
1
Recientemente tuve una situación en la que Chrome puso cosas divertidas cuando el tipo de entrada es fecha, creo que parte de html5, quería usar jquery datepicker en su lugar, así que elegí DataType.Text, que aún me permitió usar el formato lo suficientemente bueno
John
2
No es necesario disculparse por llegar tarde, publicar respuestas a preguntas antiguas puede ser de gran ayuda para las personas que no son OP. Esta es la respuesta que estaba buscando porque sabía que era posible pero no podía recordar cómo, y la publicaste hace 3 años. En todo caso, es increíblemente temprano.
RyanfaeScotland
si la fecha proviene de una base de datos, no sé cómo podría ayudar esto ... no puedo resolverlo
Antoine Pelletier
41

Esto funciona si desea mostrar en un TextBox:

@Html.TextBoxFor(m => m.Employee.DOB, "{0:dd-MM-yyyy}")
Brij
fuente
la fecha se mostrará incorrectamente si el navegador tiene un formato diferente en la configuración que "dd-MM-aaaa", es decir, "MM-dd-aaaa"
Oleg Sh
16

La fecha / hora en la base de fechas no será una versión formateada en absoluto. Será solo la fecha / hora en sí. Cómo muestra esa fecha / hora cuando extrae el valor de la base de datos es un asunto diferente. Sospecho fuertemente que realmente solo quieres:

model.Returndate = DateTime.Now.Date;

o posiblemente

model.Returndate = DateTime.UtcNow.Date;

Sí, si miras la base de datos usando SQL Server Studio o lo que sea, ahora verás la medianoche, pero eso es irrelevante, y cuando extraes la fecha de la base de datos y la muestras a un usuario, entonces se puede aplicar el formato relevante .

EDITAR: Con respecto a su pregunta editada, el problema no está en el modelo, sino en cómo especifica la vista. Deberías usar algo como:

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

donde des el especificador de formato de fecha y hora estándar para el patrón de fecha corta (lo que significa que tendrá en cuenta la configuración cultural actual).

Esa es la parte que he estado diciendo repetidamente: que cuando muestra la fecha / hora al usuario , ese es el momento para formatearla como una fecha sin una hora.

EDITAR: Si esto no funciona, debería haber una forma de decorar el modelo o la vista con una cadena de formato, o algo así. No soy realmente una persona MVC, pero se siente como si hubiera debería haber una buena manera de hacer esto declarativamente ...

Jon Skeet
fuente
DateTime.Now.Date todavía muestra la hora junto con la fecha.
ZVenue
1
@ZVenue: ¿Dónde lo muestra? Debería almacenar un valor DateTime y usar un especificador de formato de solo fecha donde sea que muestre la fecha. El código que ha proporcionado (estableciendo una propiedad en el modelo) es presumiblemente para almacenamiento, por lo que no importa que tenga una hora de medianoche.
Jon Skeet
Jon sugiere de qué estaba hablando, guardando la fecha en SQL tal como está; entonces puede simplemente formatear su fecha apropiadamente cuando la imprima.
Russ Clarke
2
@Jon: Recibo este error cuando utilicé su código de edición para html.editorfor .... "Las plantillas solo se pueden usar con acceso a campo, acceso a propiedad, índice de matriz de una dimensión o expresiones de indexación personalizadas de un solo parámetro". ... en tiempo de ejecución
ZVenue
1
@ZVenue: Eche un vistazo a esto también: stackoverflow.com/questions/5033902/…
Jon Skeet
8

Puede modificar su ViewModel de la siguiente manera:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}",ApplyFormatInEditMode = true)]
Ishant Sitaula
fuente
Esta solución también resuelve el problema del conflicto del selector de fechas de Chrome. Si solo especifica Datatype.Date en Viewmodel, Chrome usa su propia versión de datepicker en el cuadro de texto. ¡Gracias!
Katherine
7

Puede aplicar un formato de fecha y hora personalizado usando ToStringcomo:

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

DateTime.ToStringPuede encontrar más información sobre el patrón de formatos aquí y aquí .

Editar: después de editar su pregunta, al igual que lo que otros sugirieron, debe aplicar el formato de fecha en su vista:

model.Returndate = DateTime.Now.Date;

@Html.EditorFor(model => model.Returndate.Date.ToString("MM/dd/yyyy"))
Jalal Said
fuente
1
Sin embargo, eso no ayudará con la cuestión de guardar la fecha.
Russ Clarke
¿No puede salvarlo con una llamada model.Returndate.ToString("mm/dd/yyyy")?
Jalal Said
Eso es un problema ... Estoy poniendo ese valor en un campo de fecha y hora en la base de datos. Entonces esto no funcionará ... por favor vea mi publicación original.
ZVenue
¿No debería ser .ToString ("MM / dd / aaaa")? ¡mm son minutos, no meses!
Bodrick
@Bodrich: gracias, actualizado, aunque solo copio y pego su patrón.
Jalal Said
4

No estoy seguro en Razor pero en ASPX lo haces:

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

Debe haber algo similar en Razor. Espero que esto ayude a alguien.

G Jeny Ramírez
fuente
1
Sí, esto también funcionaría en la sintaxis de Razor, por ejemplo, @ Html.Encode (string.Format ("0: D", item.Modify_Date))
Ciaran Gallagher
4

Si tiene un bucle for como el que se muestra a continuación.

Cambie @ item.StartDate a @ item.StartDate.Value.ToShortDateString ()

Esto eliminará el tiempo en caso de que no pueda anotar su propiedad en el modelo como en mi 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>
Apolo
fuente
2

Incluya anotaciones de datos como DisplayFormat y ApplyFormatInEditMode para obtener el resultado deseado.

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

Ahora su fecha de facturación se mostrará como.

ingrese la descripción de la imagen aquí

Pradip Rupareliya
fuente
Por favor, eche un vistazo a las otras respuestas. ¿Crees que el tuyo es necesario y agrega contenido nuevo de calidad a la publicación?
L. Guthardt
1

Simplemente podría convertir la fecha y hora. Algo como:

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

Tuve algunos problemas con las otras soluciones en esta página, así que pensé en incluir esto.

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

Por lo tanto, solo necesita agregar "{0: d}" en el segundo parámetro y debería estar listo para comenzar.

Sotavento
fuente