Wie berechnet man “Zeit” in Java?

In Ruby on Rails gibt es eine function, mit der Sie jedes Datum nehmen und ausdrucken können, wie “vor langer Zeit” es war.

Beispielsweise:

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

Gibt es einen einfachen Weg, dies in Java zu tun?

Solutions Collecting From Web of "Wie berechnet man “Zeit” in Java?"

Schauen Sie sich die PrettyTime- Bibliothek an.

Es ist ziemlich einfach zu benutzen:

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

Sie können ein Gebietsschema für internationalisierte Nachrichten auch übergeben:

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

Wie in den Kommentaren erwähnt, hat Android diese functionalität in die class android.text.format.DateUtils .

Hast du das TimeUnit- Enum in Betracht gezogen ? Es kann für diese Art von Sache ziemlich nützlich sein

  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(); } 
  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 * " days,  hours,  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 */ } } 

more @ Formatieren Sie eine Dauer in Millisekunden in ein für Menschen lesbares Format

Ich nehme RealHowTo und Ben J Antworten und mache meine eigene Version:

 public class TimeAgo { public static final List 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 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)); }} 

welches das folgende druckt

 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 

Dies basiert auf der Antwort von RealHowTo. Wenn Sie es mögen, geben Sie ihm auch etwas Liebe.

In dieser bereinigten Version können Sie den Zeitrahmen angeben, an dem Sie interessiert sein könnten.

Es behandelt auch den “und” Teil ein wenig anders. Ich finde oft, wenn man Strings mit einem Trennzeichen verbindet, ist es einfacher, die komplizierte Logik zu überspringen und einfach das letzte Trennzeichen zu löschen, wenn du fertig bist.

 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(); } } 

Kleiner Code, um es zu drehen:

 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)); } } } 

Welches gibt folgendes aus:

 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 

Und falls jemand es jemals braucht, ist hier eine class, die jeden String wie den obigen in Millisekunden umwandeln wird. Es ist sehr nützlich, um Personen Zeitüberschreitungen verschiedener Dinge in lesbarem Text zu geben.

Es gibt einen einfachen Weg, dies zu tun:

Lass uns sagen, dass du vor 20 Minuten die Zeit haben willst:

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

das ist es..

java.time

Verwendung des java.time- Frameworks, das in Java 8 und höher integriert ist.

 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"); 

Wenn Sie nach einem einfachen “Heute”, “Gestern” oder “x Tagen” suchen.

 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"; } 

Über eingebaute Lösungen:

Java hat keine eingebaute Unterstützung für die Formatierung von relativen Zeiten, auch nicht Java-8 und sein neues Paket java.time . Wenn Sie nur Englisch und nichts anderes brauchen, und nur dann eine handgemachte Lösung akzeptabel sein könnte – siehe die Antwort von @RealHowTo (obwohl es den starken Nachteil hat, die Zeitzone für die Übersetzung von Sofortdeltas auf Ortszeit nicht zu berücksichtigen Einheiten!). Wie auch immer, wenn Sie selbst entwickelte komplexe Workarounds für andere Gebietsschemas vermeiden möchten, benötigen Sie eine externe Bibliothek.

In letzterem Fall empfehle ich, meine Bibliothek Time4J (oder Time4A unter Android) zu benutzen. Es bietet größte Flexibilität und die meisten i18n-Power . Die class net.time4j.PrettyTime hat zu diesem Zweck sieben Methoden printRelativeTime...(...) . Beispiel mit einer Testuhr als Zeitquelle:

 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) 

Ein weiteres Beispiel, das java.time.Instant als Eingabe verwendet:

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

Diese Bibliothek unterstützt über die neueste Version (v4.17) 80 Sprachen und auch einige länderspezifische Gebietsschemata (insbesondere für Spanisch, Englisch, Arabisch, Französisch). Die i18n-Daten basieren hauptsächlich auf der neuesten CLDR-Version v29 . Andere wichtige Gründe, warum diese Bibliothek verwendet werden sollte, sind gute Unterstützung für Pluralregeln (die sich oft von Englisch in anderen Sprachen unterscheiden), abgekürzter Formatierungsstil (zum Beispiel: “vor 1 Sekunde”) und expressive Möglichkeiten zur Berücksichtigung von Zeitzonen . Time4J ist sich selbst solcher exotischen Details wie Schaltsekunden bei der Berechnung relativer Zeiten bewusst (nicht wirklich wichtig, aber es bildet eine Nachricht, die sich auf den Erwartungshorizont bezieht). Die Kompatibilität mit Java-8 besteht aufgrund leicht verfügbarer Konvertierungsmethoden für Typen wie java.time.Instant oder java.time.Period .

Gibt es irgendwelche Nachteile? Nur zwei.

  • Die Bibliothek ist nicht klein (auch wegen ihres großen i18n-Daten-Repository).
  • Die API ist nicht gut bekannt, so dass das Wissen und die Unterstützung der Community noch nicht verfügbar sind. Ansonsten ist die mitgelieferte Dokumentation ziemlich detailliert und umfassend.

(Kompakte) Alternativen:

Wenn Sie eine kleinere Lösung suchen und nicht so viele functionen benötigen und bereit sind, mögliche Qualitätsprobleme im Zusammenhang mit i18n-Daten zu tolerieren, dann:

  • Ich würde ocpsoft / PrettyTime (Unterstützung für eigentlich 32 Sprachen (bald 34?) Nur für die Arbeit mit java.util.Date empfehlen – siehe die Antwort von @ataylor). Der Industriestandard CLDR (vom Unicode-Konsortium) mit seinem großen Community-Hintergrund ist leider keine Basis für die i18n-Daten, so dass weitere Verbesserungen oder Verbesserungen der Daten eine Weile dauern können …

  • Wenn Sie auf Android sind, dann ist die Hilfsklasse android.text.format.DateUtils eine schlanke eingebaute Alternative (siehe andere Kommentare und Antworten hier, mit dem Nachteil, dass sie jahrelang keine Unterstützung hat. Und ich bin mir sicher, dass nur sehr wenige Leute mögen den API-Stil dieser Hilfsklasse.

  • Wenn Sie ein Fan von Joda-Time sind, dann können Sie seine class PeriodFormat (Unterstützung für 14 Sprachen in Version v2.9.4, auf der anderen Seite: Joda-Time ist sicherlich nicht kompakt, also ich erwähne es hier nur für Vollständigkeit). Diese Bibliothek ist keine echte Antwort, da die relativen Zeiten überhaupt nicht unterstützt werden. Sie müssen mindestens das Literal “her” anhängen (und alle unteren Einheiten manuell aus den generierten Listenformaten entfernen – peinlich). Im Gegensatz zu Time4J oder Android-DateUtils bietet es keine spezielle Unterstützung für Abkürzungen oder automatisches Umschalten von relativen Zeiten auf absolute Zeitdarstellungen. Wie PrettyTime ist es vollständig abhängig von den unbestätigten Beiträgen privater Mitglieder der Java-Community zu ihren i18n-Daten.

Ich habe einen einfachen Java-timeago- Port des jquery-timeago- Plug- Ins erstellt, der genau das tut, wonach du verlangst .

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

Das Joda-Time- Paket hat den Begriff der Perioden . Sie können Arithmetik mit Perioden und DatumZeiten durchführen.

Aus den Dokumenten :

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

Sie können diese function verwenden, um die Zeit vorher zu berechnen

  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) Hier ist time_ago in Mikrosekunde

Es ist nicht schön … aber am nächsten kommt mir die Verwendung von Joda-Time (wie in diesem Beitrag beschrieben: Wie kann ich die vergangene Zeit mit Joda Time berechnen?

Falls Sie eine App für Android entwickeln, stellt sie für alle diese Anforderungen die Dienstprogrammklasse DateUtils bereit . Sehen Sie sich die Utility-Methode DateUtils # getRelativeTimeSpanString () an .

Aus den Dokumenten für

CharSequence getRelativeTimeSpanString (lange Zeit, lange jetzt, lange minResolution)

Gibt eine Zeichenfolge zurück, die “Zeit” als Zeit relativ zu “Jetzt” beschreibt. Zeitspannen in der Vergangenheit sind wie “vor 42 Minuten” formatiert. Zeitspannen in der Zukunft werden wie “In 42 Minuten” formatiert.

Sie werden Ihren timestamp als Zeit und System.currentTimeMillis() wie jetzt übergeben . Mit der minResolution können Sie die Mindestzeitraumspanne für den Bericht angeben.

Zum Beispiel wird eine Zeit von 3 Sekunden in der Vergangenheit als “0 Minuten zuvor” gemeldet, wenn dies auf MINUTE_IN_MILLIS eingestellt ist. Übergeben Sie einen von 0, MINUTE_IN_MILLIS, HOUR_IN_MILLIS, DAY_IN_MILLIS, WEEK_IN_MILLIS usw.

Dies ist ein besserer Code, wenn wir die performance berücksichtigen. Er reduziert die Anzahl der Berechnungen. Grund Minuten werden nur berechnet, wenn die Anzahl der Sekunden größer als 60 ist und Stunden nur berechnet werden, wenn die Anzahl der Minuten größer als 60 ist usw.

 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"; } } } } } } } } } 

Nach langer Recherche habe ich das gefunden.

  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; } } 

Für Android Genau wie Ravi sagte, aber da viele Leute nur das Ding kopieren wollen, ist es hier.

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

Erklärung für Leute, die mehr Zeit haben

  1. Sie erhalten die Daten von irgendwo. Zuerst müssen Sie herausfinden, welches Format es hat.

Ex. Ich bekomme die Daten von einem Server im Format Mi, 27 Jan 2016 09:32:35 GMT [das ist wahrscheinlich NICHT dein Fall]

das wird übersetzt in

SimpleDateFormat formatter = new SimpleDateFormat (“EEE, TT MMM JJJJ HH: mm: ss Z”);

woher weiß ich es? Lesen Sie die Dokumentation hier.

Dann, nachdem ich es analysiert habe, bekomme ich ein Date. an diesem Datum habe ich den getRelativeTimeSpanString eingefügt (ohne zusätzliche Parameter ist für mich in Ordnung, standardmäßig auf Minuten zu setzen)

Sie erhalten eine Ausnahme, wenn Sie nicht die richtige Parsing-String , etwas wie: Ausnahme bei Zeichen 5 herausfinden. Sehen Sie sich das Zeichen 5 an und korrigieren Sie Ihre erste Parsing-Zeichenfolge. . Möglicherweise erhalten Sie eine weitere Ausnahme. Wiederholen Sie diese Schritte, bis Sie die richtige Formel haben.

Basierend auf einer Reihe von Antworten habe ich folgendes für meinen Anwendungsfall erstellt.

Beispielverwendung:

 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 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 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(); } } 

Hier ist meine Java-Implementierung von diesem

  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(); } } 

Für mich geht das

 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; } } 

Dies ist das sehr grundlegende Skript. es ist leicht zu improvisieren.
Ergebnis: (XXX Vor Stunden) oder (XX Tage vorher / Gestern / Heute)

  ,or