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.
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")
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())
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)
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]
.
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".
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.
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")%>
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; }
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");
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
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
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.
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
}
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
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
.
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