2011-03-14 8 views
13

Duplicar posibles:
How do I calculate relative time?asp.net mvc en palabras del ayudante

¿Hay algo similar a time_ago_in_words ayudante rieles para asp.net MVC?

+0

Es difícil estar seguro porque no he utilizado personalmente los rieles o el ayudante al que se refiere, pero según el [contexto] (http://bit.ly/h7zYCS) de la documentación, parece ser similar a un HtmlHelper en ASP.NET MVC. Dicho esto, no creo que esto sea un duplicado. Sí, el código en el duplicado sugerido funcionaría, pero ese es un enfoque puramente del lado del servidor. No es necesario generar el resultado deseado en el servidor y, por lo tanto, la respuesta que he proporcionado que difiere del duplicado sigue siendo pertinente. ** No cierre esta pregunta **. –

+1

Incluir detalles sobre cómo ['time_ago_in_words'] (http://apidock.com/rails/ActionView/Helpers/DateHelper/time_ago_in_words) funciona probablemente sea muy útil para ayudar a la gente a responder de manera efectiva. Incluir detalles sobre cómo * usted * desea usarlo sería * aún mejor *. – Shog9

+0

Esto realmente no debería haberse cerrado ... * Vuelva a abrir. * –

Respuesta

23

Según el objetivo de salida previsto, el complemento jQuery Timeago puede ser una mejor opción.

He aquí un HtmlHelper para crear un elemento que contiene una marca de tiempo <abbr />ISO 8601:

public static MvcHtmlString Timeago(this HtmlHelper helper, DateTime dateTime) { 
    var tag = new TagBuilder("abbr"); 
    tag.AddCssClass("timeago"); 
    tag.Attributes.Add("title", dateTime.ToString("s") + "Z"); 
    tag.SetInnerText(dateTime.ToString()); 

    return MvcHtmlString.Create(tag.ToString()); 
} 

combine la salida del ayudante anterior con la siguiente JavaScript en algún lugar de su página y usted estará en el dinero.

<script src="jquery.min.js" type="text/javascript"></script> 
<script src="jquery.timeago.js" type="text/javascript"></script> 

jQuery(document).ready(function() { 
    jQuery("abbr.timeago").timeago(); 
}); 
+0

Si paso una fecha dateTime.ToUniversal() el timeago calcula la hora relativa correctamente pero la información sobre herramientas muestra la hora en la zona horaria UTC en lugar del cliente zona horaria de la computadora. ¿Qué me estoy perdiendo? – emzero

+0

¡Realmente amo esto, gracias! Creo que la salida original de la fecha podría ser más amigable aunque en 'SetInnerText', voy a cambiar eso para que se degrade muy bien. – Luke

18

Actualmente estoy usando el siguiente método de extensión. No estoy seguro si es el mejor disponible por ahí.

public static string ToRelativeDate(this DateTime dateTime) 
{ 
    var timeSpan = DateTime.Now - dateTime; 

    if (timeSpan <= TimeSpan.FromSeconds(60)) 
     return string.Format("{0} seconds ago", timeSpan.Seconds); 

    if (timeSpan <= TimeSpan.FromMinutes(60)) 
     return timeSpan.Minutes > 1 ? String.Format("about {0} minutes ago", timeSpan.Minutes) : "about a minute ago"; 

    if (timeSpan <= TimeSpan.FromHours(24)) 
     return timeSpan.Hours > 1 ? String.Format("about {0} hours ago", timeSpan.Hours) : "about an hour ago"; 

    if (timeSpan <= TimeSpan.FromDays(30)) 
     return timeSpan.Days > 1 ? String.Format("about {0} days ago", timeSpan.Days) : "yesterday"; 

    if (timeSpan <= TimeSpan.FromDays(365)) 
     return timeSpan.Days > 30 ? String.Format("about {0} months ago", timeSpan.Days/30) : "about a month ago"; 

    return timeSpan.Days > 365 ? String.Format("about {0} years ago", timeSpan.Days/365) : "about a year ago"; 
} 

El ayudante debe ser algo como esto:

public MvcHtmlString Timeago(this HtmlHelper helper, DateTime dateTime) 
{ 
    return MvcHtmlString.Create(dateTime.ToRelativeDate()); 
} 

espero que ayude!

+3

pequeño nitpick, tiene errores de pluralización con esta función –

Cuestiones relacionadas