two now hours dates java date time datediff relative-time-span

now - java difference between dates in days



¿Cómo calcular "tiempo atrás" en Java? (21)

En Ruby on Rails, hay una función que le permite tomar cualquier fecha e imprimir cómo fue "hace mucho tiempo".

Por ejemplo:

8 minutes ago 8 hours ago 8 days ago 8 months ago 8 years ago

¿Hay alguna manera fácil de hacer esto en Java?


java.time

Usar el marco java.time integrado en Java 8 y posterior.

LocalDateTime t1 = LocalDateTime.of(2015, 1, 1, 0, 0, 0); LocalDateTime t2 = LocalDateTime.now(); Period period = Period.between(t1.toLocalDate(), t2.toLocalDate()); Duration duration = Duration.between(t1, t2); System.out.println("First January 2015 is " + period.getYears() + " years ago"); System.out.println("First January 2015 is " + period.getMonths() + " months ago"); System.out.println("First January 2015 is " + period.getDays() + " days ago"); System.out.println("First January 2015 is " + duration.toHours() + " hours ago"); System.out.println("First January 2015 is " + duration.toMinutes() + " minutes ago");


¿Has considerado la enumeración TimeUnit ? Puede ser bastante útil para este tipo de cosas

try { SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); Date past = format.parse("01/10/2010"); Date now = new Date(); System.out.println(TimeUnit.MILLISECONDS.toMillis(now.getTime() - past.getTime()) + " milliseconds ago"); System.out.println(TimeUnit.MILLISECONDS.toMinutes(now.getTime() - past.getTime()) + " minutes ago"); System.out.println(TimeUnit.MILLISECONDS.toHours(now.getTime() - past.getTime()) + " hours ago"); System.out.println(TimeUnit.MILLISECONDS.toDays(now.getTime() - past.getTime()) + " days ago"); } catch (Exception j){ j.printStackTrace(); }


Aquí está mi Implementación de Java de este

public static String relativeDate(Date date){ Date now=new Date(); if(date.before(now)){ int days_passed=(int) TimeUnit.MILLISECONDS.toDays(now.getTime() - date.getTime()); if(days_passed>1)return days_passed+" days ago"; else{ int hours_passed=(int) TimeUnit.MILLISECONDS.toHours(now.getTime() - date.getTime()); if(hours_passed>1)return days_passed+" hours ago"; else{ int minutes_passed=(int) TimeUnit.MILLISECONDS.toMinutes(now.getTime() - date.getTime()); if(minutes_passed>1)return minutes_passed+" minutes ago"; else{ int seconds_passed=(int) TimeUnit.MILLISECONDS.toSeconds(now.getTime() - date.getTime()); return seconds_passed +" seconds ago"; } } } } else { return new SimpleDateFormat("HH:mm:ss MM/dd/yyyy").format(date).toString(); } }


Basado en un montón de respuestas aquí, creé lo siguiente para mi caso de uso.

Ejemplo de uso:

String relativeDate = String.valueOf( TimeUtils.getRelativeTime( 1000L * myTimeInMillis() ));

import java.util.Arrays; import java.util.List; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.HOURS; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.SECONDS; /** * Utilities for dealing with dates and times */ public class TimeUtils { public static final List<Long> times = Arrays.asList( DAYS.toMillis(365), DAYS.toMillis(30), DAYS.toMillis(7), DAYS.toMillis(1), HOURS.toMillis(1), MINUTES.toMillis(1), SECONDS.toMillis(1) ); public static final List<String> timesString = Arrays.asList( "yr", "mo", "wk", "day", "hr", "min", "sec" ); /** * Get relative time ago for date * * NOTE: * if (duration > WEEK_IN_MILLIS) getRelativeTimeSpanString prints the date. * * ALT: * return getRelativeTimeSpanString(date, now, SECOND_IN_MILLIS, FORMAT_ABBREV_RELATIVE); * * @param date String.valueOf(TimeUtils.getRelativeTime(1000L * Date/Time in Millis) * @return relative time */ public static CharSequence getRelativeTime(final long date) { return toDuration( Math.abs(System.currentTimeMillis() - date) ); } private static String toDuration(long duration) { StringBuilder sb = new StringBuilder(); for(int i=0;i< times.size(); i++) { Long current = times.get(i); long temp = duration / current; if (temp > 0) { sb.append(temp) .append(" ") .append(timesString.get(i)) .append(temp > 1 ? "s" : "") .append(" ago"); break; } } return sb.toString().isEmpty() ? "now" : sb.toString(); } }


Después de una larga investigación encontré esto.

public class GetTimeLapse { public static String getlongtoago(long createdAt) { DateFormat userDateFormat = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy"); DateFormat dateFormatNeeded = new SimpleDateFormat("MM/dd/yyyy HH:MM:SS"); Date date = null; date = new Date(createdAt); String crdate1 = dateFormatNeeded.format(date); // Date Calculation DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); crdate1 = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(date); // get current date time with Calendar() Calendar cal = Calendar.getInstance(); String currenttime = dateFormat.format(cal.getTime()); Date CreatedAt = null; Date current = null; try { CreatedAt = dateFormat.parse(crdate1); current = dateFormat.parse(currenttime); } catch (java.text.ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } // Get msec from each, and subtract. long diff = current.getTime() - CreatedAt.getTime(); long diffSeconds = diff / 1000; long diffMinutes = diff / (60 * 1000) % 60; long diffHours = diff / (60 * 60 * 1000) % 24; long diffDays = diff / (24 * 60 * 60 * 1000); String time = null; if (diffDays > 0) { if (diffDays == 1) { time = diffDays + "day ago "; } else { time = diffDays + "days ago "; } } else { if (diffHours > 0) { if (diffHours == 1) { time = diffHours + "hr ago"; } else { time = diffHours + "hrs ago"; } } else { if (diffMinutes > 0) { if (diffMinutes == 1) { time = diffMinutes + "min ago"; } else { time = diffMinutes + "mins ago"; } } else { if (diffSeconds > 0) { time = diffSeconds + "secs ago"; } } } } return time; } }


Eche un vistazo a la biblioteca PrettyTime .

Es bastante simple de usar:

import org.ocpsoft.prettytime.PrettyTime; PrettyTime p = new PrettyTime(); System.out.println(p.format(new Date())); // prints "moments ago"

También puede pasar en una configuración regional para mensajes internacionalizados:

PrettyTime p = new PrettyTime(new Locale("fr")); System.out.println(p.format(new Date())); // prints "à l''instant"

Como se señala en los comentarios, Android tiene esta funcionalidad incorporada en la clase android.text.format.DateUtils .


El paquete joda-time tiene la noción de Periods . Puede hacer aritmética con Períodos y Fecha y hora.

De los docs :

public boolean isRentalOverdue(DateTime datetimeRented) { Period rentalPeriod = new Period().withDays(2).withHours(12); return datetimeRented.plus(rentalPeriod).isBeforeNow(); }


En caso de que esté desarrollando una aplicación para Android, proporciona la clase de utilidad DateUtils para todos los requisitos. Eche un vistazo al método de utilidad DateUtils#getRelativeTimeSpanString() .

De los documentos para

CharSequence getRelativeTimeSpanString (long time, long now, long minResolution)

Devuelve una cadena que describe ''tiempo'' como un tiempo relativo a ''ahora''. Los períodos de tiempo en el pasado tienen el formato "hace 42 minutos". Los períodos de tiempo en el futuro están formateados como "En 42 minutos".

timestamp su timestamp tiempo como hora y System.currentTimeMillis() como ahora . El minResolution permite especificar el intervalo de tiempo mínimo para informar.

Por ejemplo, un tiempo de 3 segundos en el pasado se informará como "0 minutos atrás" si se establece en MINUTE_IN_MILLIS. Pase uno de 0, MINUTE_IN_MILLIS, HOUR_IN_MILLIS, DAY_IN_MILLIS, WEEK_IN_MILLIS, etc.


Este es el guión muy básico. es fácil de improvisar
Resultado: (Hace XXX Horas), o (XX Días Hace / Ayer / Hoy)

<span id=''hourpost''></span> ,or <span id=''daypost''></span> <script> var postTime = new Date(''2017/6/9 00:01''); var now = new Date(); var difference = now.getTime() - postTime.getTime(); var minutes = Math.round(difference/60000); var hours = Math.round(minutes/60); var days = Math.round(hours/24); var result; if (days < 1) { result = "Today"; } else if (days < 2) { result = "Yesterday"; } else { result = days + " Days ago"; } document.getElementById("hourpost").innerHTML = hours + "Hours Ago" ; document.getElementById("daypost").innerHTML = result ; </script>


Este es un código mejor si consideramos el rendimiento. Reduce el número de cálculos. Motivo Los minutos se calculan solo si el número de segundos es mayor que 60 y las horas se calculan solo si el número de minutos es mayor que 60 y así sucesivamente ...

class timeAgo { static String getTimeAgo(long time_ago) { time_ago=time_ago/1000; long cur_time = (Calendar.getInstance().getTimeInMillis())/1000 ; long time_elapsed = cur_time - time_ago; long seconds = time_elapsed; // Seconds if (seconds <= 60) { return "Just now"; } //Minutes else{ int minutes = Math.round(time_elapsed / 60); if (minutes <= 60) { if (minutes == 1) { return "a minute ago"; } else { return minutes + " minutes ago"; } } //Hours else { int hours = Math.round(time_elapsed / 3600); if (hours <= 24) { if (hours == 1) { return "An hour ago"; } else { return hours + " hrs ago"; } } //Days else { int days = Math.round(time_elapsed / 86400); if (days <= 7) { if (days == 1) { return "Yesterday"; } else { return days + " days ago"; } } //Weeks else { int weeks = Math.round(time_elapsed / 604800); if (weeks <= 4.3) { if (weeks == 1) { return "A week ago"; } else { return weeks + " weeks ago"; } } //Months else { int months = Math.round(time_elapsed / 2600640); if (months <= 12) { if (months == 1) { return "A month ago"; } else { return months + " months ago"; } } //Years else { int years = Math.round(time_elapsed / 31207680); if (years == 1) { return "One year ago"; } else { return years + " years ago"; } } } } } } } } }


Esto se basa en la respuesta de RealHowTo, así que si te gusta, dale un poco de amor también.

Esta versión limpia le permite especificar el rango de tiempo que le puede interesar.

También maneja la parte "y" un poco diferente. A menudo encuentro que al unir cadenas con un delimitador, es más fácil omitir la lógica complicada y simplemente eliminar el último delimitador cuando haya terminado.

import java.util.concurrent.TimeUnit; import static java.util.concurrent.TimeUnit.MILLISECONDS; public class TimeUtils { /** * Converts time to a human readable format within the specified range * * @param duration the time in milliseconds to be converted * @param max the highest time unit of interest * @param min the lowest time unit of interest */ public static String formatMillis(long duration, TimeUnit max, TimeUnit min) { StringBuilder res = new StringBuilder(); TimeUnit current = max; while (duration > 0) { long temp = current.convert(duration, MILLISECONDS); if (temp > 0) { duration -= current.toMillis(temp); res.append(temp).append(" ").append(current.name().toLowerCase()); if (temp < 2) res.deleteCharAt(res.length() - 1); res.append(", "); } if (current == min) break; current = TimeUnit.values()[current.ordinal() - 1]; } // clean up our formatting.... // we never got a hit, the time is lower than we care about if (res.lastIndexOf(", ") < 0) return "0 " + min.name().toLowerCase(); // yank trailing ", " res.deleteCharAt(res.length() - 2); // convert last ", " to " and" int i = res.lastIndexOf(", "); if (i > 0) { res.deleteCharAt(i); res.insert(i, " and"); } return res.toString(); } }

Pequeño código para darle un giro:

import static java.util.concurrent.TimeUnit.*; public class Main { public static void main(String args[]) { long[] durations = new long[]{ 123, SECONDS.toMillis(5) + 123, DAYS.toMillis(1) + HOURS.toMillis(1), DAYS.toMillis(1) + SECONDS.toMillis(2), DAYS.toMillis(1) + HOURS.toMillis(1) + MINUTES.toMillis(2), DAYS.toMillis(4) + HOURS.toMillis(3) + MINUTES.toMillis(2) + SECONDS.toMillis(1), DAYS.toMillis(5) + HOURS.toMillis(4) + MINUTES.toMillis(1) + SECONDS.toMillis(23) + 123, DAYS.toMillis(42) }; for (long duration : durations) { System.out.println(TimeUtils.formatMillis(duration, DAYS, SECONDS)); } System.out.println("/nAgain in only hours and minutes/n"); for (long duration : durations) { System.out.println(TimeUtils.formatMillis(duration, HOURS, MINUTES)); } } }

Que dará como resultado lo siguiente:

0 seconds 5 seconds 1 day and 1 hour 1 day and 2 seconds 1 day, 1 hour and 2 minutes 4 days, 3 hours, 2 minutes and 1 second 5 days, 4 hours, 1 minute and 23 seconds 42 days Again in only hours and minutes 0 minutes 0 minutes 25 hours 24 hours 25 hours and 2 minutes 99 hours and 2 minutes 124 hours and 1 minute 1008 hours

Y en caso de que alguien lo necesite, aquí hay una clase que convertirá cualquier cadena como la anterior en milisegundos . Es bastante útil para permitir que las personas especifiquen tiempos de espera de varias cosas en el texto legible.



Puedes usar esta función para calcular el tiempo atrás

private String timeAgo(long time_ago) { long cur_time = (Calendar.getInstance().getTimeInMillis()) / 1000; long time_elapsed = cur_time - time_ago; long seconds = time_elapsed; int minutes = Math.round(time_elapsed / 60); int hours = Math.round(time_elapsed / 3600); int days = Math.round(time_elapsed / 86400); int weeks = Math.round(time_elapsed / 604800); int months = Math.round(time_elapsed / 2600640); int years = Math.round(time_elapsed / 31207680); // Seconds if (seconds <= 60) { return "just now"; } //Minutes else if (minutes <= 60) { if (minutes == 1) { return "one minute ago"; } else { return minutes + " minutes ago"; } } //Hours else if (hours <= 24) { if (hours == 1) { return "an hour ago"; } else { return hours + " hrs ago"; } } //Days else if (days <= 7) { if (days == 1) { return "yesterday"; } else { return days + " days ago"; } } //Weeks else if (weeks <= 4.3) { if (weeks == 1) { return "a week ago"; } else { return weeks + " weeks ago"; } } //Months else if (months <= 12) { if (months == 1) { return "a month ago"; } else { return months + " months ago"; } } //Years else { if (years == 1) { return "one year ago"; } else { return years + " years ago"; } } }

1) Aquí time_ago está en microsegundos


Si busca un simple "Hoy", "Ayer" o "x días atrás".

private String getDaysAgo(Date date){ long days = (new Date().getTime() - date.getTime()) / 86400000; if(days == 0) return "Today"; else if(days == 1) return "Yesterday"; else return days + " days ago"; }


Tomo respuestas de RealHowTo y Ben J y hago mi propia versión:

public class TimeAgo { public static final List<Long> times = Arrays.asList( TimeUnit.DAYS.toMillis(365), TimeUnit.DAYS.toMillis(30), TimeUnit.DAYS.toMillis(1), TimeUnit.HOURS.toMillis(1), TimeUnit.MINUTES.toMillis(1), TimeUnit.SECONDS.toMillis(1) ); public static final List<String> timesString = Arrays.asList("year","month","day","hour","minute","second"); public static String toDuration(long duration) { StringBuffer res = new StringBuffer(); for(int i=0;i< TimeAgo.times.size(); i++) { Long current = TimeAgo.times.get(i); long temp = duration/current; if(temp>0) { res.append(temp).append(" ").append( TimeAgo.timesString.get(i) ).append(temp != 1 ? "s" : "").append(" ago"); break; } } if("".equals(res.toString())) return "0 seconds ago"; else return res.toString(); } public static void main(String args[]) { System.out.println(toDuration(123)); System.out.println(toDuration(1230)); System.out.println(toDuration(12300)); System.out.println(toDuration(123000)); System.out.println(toDuration(1230000)); System.out.println(toDuration(12300000)); System.out.println(toDuration(123000000)); System.out.println(toDuration(1230000000)); System.out.println(toDuration(12300000000L)); System.out.println(toDuration(123000000000L)); }}

que imprimirá el siguiente

0 second ago 1 second ago 12 seconds ago 2 minutes ago 20 minutes ago 3 hours ago 1 day ago 14 days ago 4 months ago 3 years ago


esto funciona para mi

public class TimeDifference { int years; int months; int days; int hours; int minutes; int seconds; String differenceString; public TimeDifference(@NonNull Date curdate, @NonNull Date olddate) { float diff = curdate.getTime() - olddate.getTime(); if (diff >= 0) { int yearDiff = Math.round((diff / (AppConstant.aLong * AppConstant.aFloat)) >= 1 ? (diff / (AppConstant.aLong * AppConstant.aFloat)) : 0); if (yearDiff > 0) { years = yearDiff; setDifferenceString(years + (years == 1 ? " year" : " years") + " ago"); } else { int monthDiff = Math.round((diff / AppConstant.aFloat) >= 1 ? (diff / AppConstant.aFloat) : 0); if (monthDiff > 0) { if (monthDiff > AppConstant.ELEVEN) { monthDiff = AppConstant.ELEVEN; } months = monthDiff; setDifferenceString(months + (months == 1 ? " month" : " months") + " ago"); } else { int dayDiff = Math.round((diff / (AppConstant.bFloat)) >= 1 ? (diff / (AppConstant.bFloat)) : 0); if (dayDiff > 0) { days = dayDiff; if (days == AppConstant.THIRTY) { days = AppConstant.TWENTYNINE; } setDifferenceString(days + (days == 1 ? " day" : " days") + " ago"); } else { int hourDiff = Math.round((diff / (AppConstant.cFloat)) >= 1 ? (diff / (AppConstant.cFloat)) : 0); if (hourDiff > 0) { hours = hourDiff; setDifferenceString(hours + (hours == 1 ? " hour" : " hours") + " ago"); } else { int minuteDiff = Math.round((diff / (AppConstant.dFloat)) >= 1 ? (diff / (AppConstant.dFloat)) : 0); if (minuteDiff > 0) { minutes = minuteDiff; setDifferenceString(minutes + (minutes == 1 ? " minute" : " minutes") + " ago"); } else { int secondDiff = Math.round((diff / (AppConstant.eFloat)) >= 1 ? (diff / (AppConstant.eFloat)) : 0); if (secondDiff > 0) { seconds = secondDiff; } else { seconds = 1; } setDifferenceString(seconds + (seconds == 1 ? " second" : " seconds") + " ago"); } } } } } } else { setDifferenceString("Just now"); } } public String getDifferenceString() { return differenceString; } public void setDifferenceString(String differenceString) { this.differenceString = differenceString; } public int getYears() { return years; } public void setYears(int years) { this.years = years; } public int getMonths() { return months; } public void setMonths(int months) { this.months = months; } public int getDays() { return days; } public void setDays(int days) { this.days = days; } public int getHours() { return hours; } public void setHours(int hours) { this.hours = hours; } public int getMinutes() { return minutes; } public void setMinutes(int minutes) { this.minutes = minutes; } public int getSeconds() { return seconds; } public void setSeconds(int seconds) { this.seconds = seconds; } }


hay una manera simple de hacer esto:

digamos que quieres el tiempo hace 20 minutos:

Long minutesAgo = new Long(20); Date date = new Date(); Date dateIn_X_MinAgo = new Date (date.getTime() - minutesAgo*60*1000);

Eso es..


Creé un puerto Java timeago simple del complemento jquery-timeago que hace lo que estás pidiendo.

TimeAgo time = new TimeAgo(); String minutes = time.timeAgo(System.currentTimeMillis() - (15*60*1000)); // returns "15 minutes ago"


Acerca de las soluciones integradas :

Java no tiene ningún soporte incorporado para formatear tiempos relativos, tampoco Java-8 y su nuevo paquete java.time . Si solo necesita inglés y nada más entonces y solo entonces, una solución hecha a mano podría ser aceptable: vea la respuesta de @RealHowTo (aunque tiene la gran desventaja de no tener en cuenta la zona horaria para la traducción de deltas instantáneos a la hora local ¡unidades!). De todos modos, si desea evitar soluciones complejas de fabricación casera, especialmente para otras configuraciones regionales, entonces necesita una biblioteca externa.

En este último caso, recomiendo usar mi biblioteca Time4J (o Time4A en Android). Ofrece la mayor flexibilidad y la mayor potencia de i18n . La clase net.time4j.PrettyTime tiene siete métodos printRelativeTime...(...) para este propósito. Ejemplo usando un reloj de prueba como fuente de tiempo:

TimeSource<?> clock = () -> PlainTimestamp.of(2015, 8, 1, 10, 24, 5).atUTC(); Moment moment = PlainTimestamp.of(2015, 8, 1, 17, 0).atUTC(); // our input String durationInDays = PrettyTime.of(Locale.GERMAN).withReferenceClock(clock).printRelative( moment, Timezone.of(EUROPE.BERLIN), TimeUnit.DAYS); // controlling the precision System.out.println(durationInDays); // heute (german word for today)

Otro ejemplo que usa java.time.Instant como entrada:

String relativeTime = PrettyTime.of(Locale.ENGLISH) .printRelativeInStdTimezone(Moment.from(Instant.EPOCH)); System.out.println(relativeTime); // 45 years ago

Esta biblioteca admite a través de su última versión (v4.17) 80 idiomas y también algunas configuraciones regionales específicas de cada país (especialmente para español, inglés, árabe, francés). Los datos i18n se basan principalmente en la versión más nueva de CLDR v29 . Otras razones importantes para usar esta biblioteca son un buen soporte para reglas plurales (que a menudo son diferentes del inglés en otras configuraciones regionales), estilo de formato abreviado (por ejemplo: "1 segundo atrás") y formas expresivas para tener en cuenta las zonas horarias . Time4J es consciente incluso de detalles tan exóticos como los segundos intercalares en los cálculos de tiempos relativos (no muy importantes, pero forma un mensaje relacionado con el horizonte de expectativas). La compatibilidad con Java-8 existe debido a los métodos de conversión fácilmente disponibles para tipos como java.time.Instant o java.time.Period .

¿Hay algún inconveniente? Sólo dos.

  • La biblioteca no es pequeña (también debido a su gran repositorio de datos i18n).
  • La API no es muy conocida, por lo que el conocimiento y la asistencia de la comunidad no están disponibles; de lo contrario, la documentación suministrada es bastante detallada y completa.

(Compacto) alternativas:

Si busca una solución más pequeña y no necesita tantas funciones y está dispuesto a tolerar posibles problemas de calidad relacionados con i18n-data, entonces:

  • Recomendaría ocpsoft / PrettyTime (soporte para 32 idiomas (¿pronto 34?) Adecuado para trabajar solo con java.util.Date - vea la respuesta de @ataylor). El estándar industrial CLDR (del consorcio Unicode) con su gran experiencia en la comunidad no es, por desgracia, una base de datos i18n, por lo que más mejoras o mejoras de datos pueden llevar un tiempo ...

  • Si está en Android, la clase de ayuda android.text.format.DateUtils es una delgada alternativa incorporada (vea otros comentarios y respuestas aquí, con la desventaja de que no tiene soporte durante años y meses. Y estoy seguro de que solo a muy pocas personas les gusta el estilo API de esta clase de ayuda.

  • Si eres fanático de Joda-Time, entonces puedes mirar su clase PeriodFormat (soporte para 14 idiomas en el lanzamiento v2.9.4, en el otro lado: Joda-Time seguramente no es compacto, así que lo menciono aquí solo para lo completo). Esta biblioteca no es una respuesta real porque los tiempos relativos no son compatibles en absoluto. Tendrá que añadir al menos el literal "ago" (y quitar manualmente todas las unidades inferiores de los formatos de lista generados, incómodo). A diferencia de Time4J o Android-DateUtils, no tiene soporte especial para abreviaturas o cambio automático de tiempos relativos a representaciones de tiempo absoluto. Al igual que PrettyTime, depende totalmente de las contribuciones no confirmadas de los miembros privados de la comunidad Java a su i18n-data.


Para Android Exactamente como dijo Ravi, pero debido a que mucha gente quiere copiar pegar la cosa aquí está.

try { SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z"); Date dt = formatter.parse(date_from_server); CharSequence output = DateUtils.getRelativeTimeSpanString (dt.getTime()); your_textview.setText(output.toString()); } catch (Exception ex) { ex.printStackTrace(); your_textview.setText(""); }

Explicación para las personas que tienen más tiempo

  1. Obtienes los datos de algún lado. Primero tienes que descubrir su formato.

Ex. Obtengo los datos de un servidor en el formato Mié, 27 de enero de 2016 09:32:35 GMT [probablemente este no sea tu caso]

esto se traduce a

Formateador SimpleDateFormat = new SimpleDateFormat ("EEE, dd MMM aaaa HH: mm: ss Z");

¿cómo lo sé? Lea la documentación aquí.

Luego, después de analizarlo, obtengo una cita. esa fecha puse en getRelativeTimeSpanString (sin ningún parámetro adicional estoy bien por mí, por defecto a los minutos)

Obtendrá una excepción si no descubrió la cadena de análisis correcta , algo así como: excepción en el carácter 5 . Mire el carácter 5 y corrija su cadena de análisis inicial. . Puede obtener otra excepción, repita estos pasos hasta que tenga la fórmula correcta.


public class TimeUtils { public final static long ONE_SECOND = 1000; public final static long SECONDS = 60; public final static long ONE_MINUTE = ONE_SECOND * 60; public final static long MINUTES = 60; public final static long ONE_HOUR = ONE_MINUTE * 60; public final static long HOURS = 24; public final static long ONE_DAY = ONE_HOUR * 24; private TimeUtils() { } /** * converts time (in milliseconds) to human-readable format * "<w> days, <x> hours, <y> minutes and (z) seconds" */ public static String millisToLongDHMS(long duration) { StringBuffer res = new StringBuffer(); long temp = 0; if (duration >= ONE_SECOND) { temp = duration / ONE_DAY; if (temp > 0) { duration -= temp * ONE_DAY; res.append(temp).append(" day").append(temp > 1 ? "s" : "") .append(duration >= ONE_MINUTE ? ", " : ""); } temp = duration / ONE_HOUR; if (temp > 0) { duration -= temp * ONE_HOUR; res.append(temp).append(" hour").append(temp > 1 ? "s" : "") .append(duration >= ONE_MINUTE ? ", " : ""); } temp = duration / ONE_MINUTE; if (temp > 0) { duration -= temp * ONE_MINUTE; res.append(temp).append(" minute").append(temp > 1 ? "s" : ""); } if (!res.toString().equals("") && duration >= ONE_SECOND) { res.append(" and "); } temp = duration / ONE_SECOND; if (temp > 0) { res.append(temp).append(" second").append(temp > 1 ? "s" : ""); } return res.toString(); } else { return "0 second"; } } public static void main(String args[]) { System.out.println(millisToLongDHMS(123)); System.out.println(millisToLongDHMS((5 * ONE_SECOND) + 123)); System.out.println(millisToLongDHMS(ONE_DAY + ONE_HOUR)); System.out.println(millisToLongDHMS(ONE_DAY + 2 * ONE_SECOND)); System.out.println(millisToLongDHMS(ONE_DAY + ONE_HOUR + (2 * ONE_MINUTE))); System.out.println(millisToLongDHMS((4 * ONE_DAY) + (3 * ONE_HOUR) + (2 * ONE_MINUTE) + ONE_SECOND)); System.out.println(millisToLongDHMS((5 * ONE_DAY) + (4 * ONE_HOUR) + ONE_MINUTE + (23 * ONE_SECOND) + 123)); System.out.println(millisToLongDHMS(42 * ONE_DAY)); /* output : 0 second 5 seconds 1 day, 1 hour 1 day and 2 seconds 1 day, 1 hour, 2 minutes 4 days, 3 hours, 2 minutes and 1 second 5 days, 4 hours, 1 minute and 23 seconds 42 days */ } }

más @ Formatea una duración en milisegundos en un formato legible por humanos