Cómo renderizar una fecha y hora en un formato específico en ASP.NET ¿MVC 3?


Si tengo en mi clase modelo una propiedad de tipo DateTime ¿cómo puedo renderizarla en un formato específico, por ejemplo en el formato que devuelve ToLongDateString()?

He intentado esto...

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

...que arroja una excepción porque la expresión debe apuntar a una propiedad o campo. Y esto...

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

...que no arroja una excepción, pero la salida renderizada está vacía (aunque val contiene el valor esperado, como pude ver en el depurador).

Gracias por propinas por adelantado!

Editar

ToLongDateString es solo un ejemplo. Lo que realmente quiero usar en lugar de ToLongDateString es un método de extensión personalizado de DateTime y 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 "";
}

Por lo tanto, creo que no puedo usar el atributo DisplayFormat y el parámetro DataFormatString en las propiedades ViewModel.

Author: Slauma, 2011-05-14

15 answers

Si todo lo que desea hacer es mostrar la fecha con un formato específico, simplemente llame a:

@String.Format(myFormat, Model.MyDateTime)

Usar @Html.DisplayFor(...) es solo trabajo extra a menos que esté especificando una plantilla, o necesite usar algo que esté construido sobre plantillas, como iterar un IEnumerable<T>. Crear una plantilla es bastante simple, y también puede proporcionar mucha flexibilidad. Cree una carpeta en su carpeta de vistas para el controlador actual (o la carpeta de vistas compartidas) llamada DisplayTemplates. Dentro de esa carpeta, agregue una vista parcial con el tipo de modelo que quiero construir la plantilla para. En este caso agregué /Views/Shared/DisplayTemplates y agregué una vista parcial llamada ShortDateTime.cshtml.

@model System.DateTime

@Model.ToShortDateString()

Y ahora puedes llamar a esa plantilla con la siguiente línea:

@Html.DisplayFor(m => m.MyDateTime, "ShortDateTime")
 158
Author: Nick Larsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-17 15:00:56

Puede decorar su propiedad view model con el [DisplayFormat] atributo:

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

Y en su opinión:

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

O, para mostrar el valor,

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

Otra posibilidad, que no recomiendo, es usar un ayudante débilmente escrito:

@Html.TextBox("MyDate", Model.MyDate.ToLongDateString())
 169
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-20 17:07:45

Salida con formato simple dentro del modelo

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

O en el bucle foreach

@String.Format("{0:d}", item.CreatedOn)
 26
Author: odesuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-07 22:38:00

Utilizo el siguiente enfoque para el formato en línea y muestro una propiedad date del modelo.

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

De lo contrario, al rellenar un cuadro de texto o Editor, podría hacer lo que @Darin sugirió, decorar el atributo con un atributo [DisplayFormat].

 23
Author: Steven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-21 14:20:21

Si todos sus tipos DateTime se representan de la misma manera, puede usar una plantilla de visualización personalizada DateTime.

En su carpeta de vistas, cree una carpeta llamada "DisplayTemplates" en la carpeta de vistas específicas de su controlador o en la carpeta "Compartida" (funcionan de forma similar a las parciales).

Dentro cree un archivo llamado DateTime.cshtml que tome DateTime como @model y codifique cómo desea representar su fecha:

@model System.DateTime
@Model.ToLongDateString()

Ahora solo puede usar esto en sus vistas y debería trabajo:

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

Siempre y cuando siga la convención de agregarlo a la carpeta "DisplayTemplates" y nombrar el archivo para que coincida con el tipo que está mostrando, MVC lo usará automáticamente para mostrar sus valores. Esto también funciona para la edición de escenarios utilizando "EditorTemplates".

Aquí hay más información sobre las plantillas .

 9
Author: ataddeini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-14 12:11:43

Mi preferencia es mantener los detalles de formato con la vista y no con el viewmodel. Así que en MVC4 / Razor:

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

Referencia de formato de fecha y hora: http://msdn.microsoft.com/en-us/library/az4se3k1 (v=vs.71). aspx

Entonces tengo un datepicker de jQuery vinculado a él, y eso pone la fecha en un formato diferente...doh!

Parece que necesito establecer el formato del datepicker al mismo formato.

Así que estoy almacenando el formato System.Globalization en un atributo data - * y recogerlo al configurar el

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

Y aquí está la parte apestosa: los formatos de. net y datepicker no coinciden, por lo que se necesita hackery:

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

Eso es un poco débil, pero debería cubrir muchos casos.

 7
Author: philn5d,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-11 13:08:49

Funciona para mí

<%=Model.MyDateTime.ToString("dd-MMM-yyyy")%>
 2
Author: numerah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-21 11:19:03

Tuvo el mismo problema recientemente.

Descubrí que simplemente definir DataType como Date en el modelo también funciona (usando el método Code First)

[DataType(DataType.Date)]
public DateTime Added { get; set; }
 2
Author: Vladislav Bolshakov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-22 12:04:14

Puedes hacer así @item.Date.Value.Tostring("dd-MMM-yy");

 1
Author: Saurabh Solanki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-28 11:41:02

Si solo quiero mostrar la fecha en formato corto, solo uso @Modelo.fecha.ToShortDateString () e imprime la fecha en

 0
Author: Marcianin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-06 23:22:02

Si todo lo que desea hacer es mostrar la fecha con un formato específico, simplemente llame a:

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

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

El resultado será el siguiente formato,

26-Apr-2013

04/26/13
 0
Author: Kailas Mane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-26 10:02:02

Esto se mostrará en formato dd/MM/yyyy en su vista

En Vista:

En lugar de DisplayFor use este código

<td>

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

</td

También comprueba si el valor es nulo en la columna de fecha, si es verdadero, entonces mostrará la fecha está vacía o la fecha con formato real de la columna.

La esperanza ayuda a alguien.

 0
Author: stom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-20 08:33:16
@{
  string datein = Convert.ToDateTime(item.InDate).ToString("dd/MM/yyyy");        
  @datein
}
 0
Author: wesley7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-15 09:49:31

En MVC5 usaría, si su modelo es el datetime

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

O si su modelo contiene la propiedad de datetime

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

Aquí está el significado oficial de los Formatos:

Https://msdn.microsoft.com/en-us/library/8kb3ddd4 (v=vs.110). aspx

 0
Author: Jose Ortega,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-09 06:46:40

Solo Ver Archivo Ajustar de esta manera. Puedes probar esto.

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

item.transdate son sus datos de tipo DateTime.

 -2
Author: Martine Chang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-11 13:09:07