Ich muss die Zeit berechnen, die von einem bestimmten Datum bis jetzt vergangen ist, und sie mit demselben Format wie StackOverflow-Fragen anzeigen, dh:
15s ago
2min ago
2hours ago
2days ago
25th Dec 08
Wissen Sie, wie Sie dies mit der Java Joda-Time- Bibliothek erreichen können ? Gibt es eine Hilfsmethode, die sie bereits implementiert, oder sollte ich den Algorithmus selbst schreiben?
java.util.Date
nur mit der alten Klasse . Meine Bibliothek Time4J ist jedoch meiner Meinung nach die beste Bibliothek zum Drucken von relativen Zeiten (Vor-Format) oder Zeiten im Format "3 Monate, 4 Tage". Es ist auch für tatsächlich 72 Sprachen lokalisierbar.Antworten:
Verwenden Sie, um die verstrichene Zeit mit JodaTime zu berechnen
Period
. VerwendenPeriodFormatter
Sie diese Option, um die verstrichene Zeit in der gewünschten menschlichen Darstellung zu formatierenPeriodFormatterBuilder
.Hier ist ein Kickoff-Beispiel:
DateTime myBirthDate = new DateTime(1978, 3, 26, 12, 35, 0, 0); DateTime now = new DateTime(); Period period = new Period(myBirthDate, now); PeriodFormatter formatter = new PeriodFormatterBuilder() .appendSeconds().appendSuffix(" seconds ago\n") .appendMinutes().appendSuffix(" minutes ago\n") .appendHours().appendSuffix(" hours ago\n") .appendDays().appendSuffix(" days ago\n") .appendWeeks().appendSuffix(" weeks ago\n") .appendMonths().appendSuffix(" months ago\n") .appendYears().appendSuffix(" years ago\n") .printZeroNever() .toFormatter(); String elapsed = formatter.print(period); System.out.println(elapsed);
Dies wird jetzt gedruckt
(Husten, alt, Husten) Sie sehen, dass ich auch Monate und Jahre berücksichtigt und so konfiguriert habe, dass die Werte weggelassen werden, wenn diese Null sind.
quelle
Verwenden Sie PrettyTime für die einfache verstrichene Zeit.
Ich habe HumanTime ausprobiert als @sfussenegger beantwortet und mit JodaTime ist
Period
aber die einfachste und sauberste Methode für die Menschen lesbare verstrichene Zeit , dass ich fand das war PrettyTime Bibliothek.Hier einige einfache Beispiele mit Ein- und Ausgabe:
Vor fünf Minuten
DateTime fiveMinutesAgo = DateTime.now().minusMinutes( 5 ); new PrettyTime().format( fiveMinutesAgo.toDate() ); // Outputs: "5 minutes ago"
Vor einiger Zeit
DateTime birthday = new DateTime(1978, 3, 26, 12, 35, 0, 0); new PrettyTime().format( birthday.toDate() ); // Outputs: "4 decades ago"
VORSICHT: Ich habe versucht, mit der präziseren Funktionalität der Bibliothek herumzuspielen, aber sie führt zu merkwürdigen Ergebnissen. Verwenden Sie sie daher vorsichtig und in nicht lebensbedrohlichen Projekten.
JP
quelle
Sie können dies mit einem PeriodFormatter tun, müssen sich jedoch nicht wie in anderen Antworten die Mühe machen, Ihren eigenen PeriodFormatBuilder zu erstellen . Wenn es zu Ihrem Fall passt, können Sie einfach den Standardformatierer verwenden:
Period period = new Period(startDate, endDate); System.out.println(PeriodFormat.getDefault().print(period))
(Hut Tipp zu dieser Antwort auf eine ähnliche Frage, ich bin Cross-Posting für Auffindbarkeit)
quelle
Es gibt eine kleine Helferklasse namens HumanTime , mit der ich ziemlich zufrieden bin.
quelle
Hierbei wird der MySQL-Zeitstempel verwendet, um die bisher verstrichene Zeit abzurufen. Singular und Plular wird verwaltet. Nur die maximale Zeit anzeigen.
HINWEIS: Stellen Sie Ihre eigene Zeitzone ein.
String getElapsedTime(String strMysqlTimestamp) { DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.S"); DateTime mysqlDate = formatter.parseDateTime(strMysqlTimestamp). withZone(DateTimeZone.forID("Asia/Kuala_Lumpur")); DateTime now = new DateTime(); Period period = new Period(mysqlDate, now); int seconds = period.getSeconds(); int minutes = period.getMinutes(); int hours = period.getHours(); int days = period.getDays(); int weeks = period.getWeeks(); int months = period.getMonths(); int years = period.getYears(); String elapsedTime = ""; if (years != 0) if (years == 1) elapsedTime = years + " year ago"; else elapsedTime = years + " years ago"; else if (months != 0) if (months == 1) elapsedTime = months + " month ago"; else elapsedTime = months + " months ago"; else if (weeks != 0) if (weeks == 1) elapsedTime = weeks + " week ago"; else elapsedTime = weeks + " weeks ago"; else if (days != 0) if (days == 1) elapsedTime = days + " day ago"; else elapsedTime = days + " days ago"; else if (hours != 0) if (hours == 1) elapsedTime = hours + " hour ago"; else elapsedTime = hours + " hours ago"; else if (minutes != 0) if (minutes == 1) elapsedTime = minutes + " minute ago"; else elapsedTime = minutes + " minutes ago"; else if (seconds != 0) if (seconds == 1) elapsedTime = seconds + " second ago"; else elapsedTime = seconds + " seconds ago"; return elapsedTime; }
quelle