In Ruby on Rails gibt es eine Funktion, mit der Sie ein beliebiges Datum auswählen und ausdrucken können, wie lange es her ist.
Beispielsweise:
8 minutes ago
8 hours ago
8 days ago
8 months ago
8 years ago
Gibt es eine einfache Möglichkeit, dies in Java zu tun?
Antworten:
Schauen Sie sich die PrettyTime- Bibliothek an.
Es ist ganz einfach zu bedienen:
Sie können auch ein Gebietsschema für internationalisierte Nachrichten übergeben:
Wie in den Kommentaren erwähnt, hat Android diese Funktionalität in die
android.text.format.DateUtils
Klasse integriert.quelle
Haben Sie die TimeUnit- Aufzählung berücksichtigt ? Es kann für solche Dinge ziemlich nützlich sein
quelle
Ich nehme die Antworten von RealHowTo und Ben J und erstelle meine eigene Version:
das wird das folgende drucken
quelle
.append(temp != 1 ? "s" : "")
anstelle von,.append(temp > 1 ? "s" : "")
weil 0 auchs
Suffix haben solltemore @ Formatiert eine Dauer in Millisekunden in ein für Menschen lesbares Format
quelle
Dies basiert auf der Antwort von RealHowTo. Wenn es Ihnen gefällt, geben Sie ihm / ihr auch etwas Liebe.
Mit dieser bereinigten Version können Sie den Zeitraum angeben, an dem Sie interessiert sein könnten.
Es behandelt auch das "und" Teil etwas anders. Ich finde oft, wenn ich Strings mit einem Trennzeichen verbinde, ist es oft einfacher, die komplizierte Logik zu überspringen und einfach das letzte Trennzeichen zu löschen, wenn Sie fertig sind.
Kleiner Code, um es zu verwirbeln:
Welches wird das folgende ausgeben:
Und falls jemand es jemals braucht, hier ist eine Klasse, die jede Zeichenfolge wie die oben genannte wieder in Millisekunden konvertiert . Es ist ziemlich nützlich, damit Benutzer Zeitüberschreitungen für verschiedene Dinge in lesbarem Text festlegen können.
quelle
Es gibt einen einfachen Weg, dies zu tun:
Nehmen wir an, Sie möchten die Zeit vor 20 Minuten:
das ist es..
quelle
Über integrierte Lösungen:
Java bietet keine integrierte Unterstützung für die Formatierung relativer Zeiten, auch nicht Java-8 und sein neues Paket
java.time
. Wenn Sie nur Englisch und nichts anderes benötigen, ist eine handgefertigte Lösung möglicherweise akzeptabel - siehe die Antwort von @RealHowTo (obwohl es den großen Nachteil hat, die Zeitzone für die Übersetzung von Sofortdeltas in die Ortszeit nicht zu berücksichtigen Einheiten!). Wenn Sie komplexe Problemumgehungen aus eigenem Anbau vermeiden möchten, insbesondere für andere Ländereinstellungen, benötigen Sie eine externe Bibliothek.Im letzteren Fall empfehle ich, meine Bibliothek Time4J (oder Time4A unter Android) zu verwenden. Es bietet größte Flexibilität und höchste i18n-Leistung . Die Klasse net.time4j.PrettyTime verfügt
printRelativeTime...(...)
zu diesem Zweck über sieben Methoden . Beispiel mit einer Testuhr als Zeitquelle:Ein weiteres Beispiel
java.time.Instant
als Eingabe:Diese Bibliothek unterstützt über ihre neueste Version (v4.17) 80 Sprachen und einige länderspezifische Gebietsschemas (insbesondere für Spanisch, Englisch, Arabisch, Französisch). Die i18n-Daten basieren hauptsächlich auf der neuesten CLDR-Version v29 . Andere wichtige Gründe für die Verwendung dieser Bibliothek sind die gute Unterstützung von Pluralregeln (die sich in anderen Regionen häufig von Englisch unterscheiden), der abgekürzte Formatstil (z. B. "vor 1 Sekunde") und ausdrucksstarke Möglichkeiten zur Berücksichtigung von Zeitzonen . Time4J ist auch bewusst so exotische Details wie Schaltsekunden in den Berechnungen der relativen Zeiten (nicht wirklich wichtig , aber es bildet eine Nachricht an den Erwartungshorizont bezogen). Die Kompatibilität mit Java-8existiert aufgrund leicht verfügbarer Konvertierungsmethoden für Typen wie
java.time.Instant
oderjava.time.Period
.Gibt es irgendwelche Nachteile? Nur zwei.
(Kompakte) Alternativen:
Wenn Sie nach einer kleineren Lösung suchen und nicht so viele Funktionen benötigen und bereit sind, mögliche Qualitätsprobleme im Zusammenhang mit i18n-Daten zu tolerieren, dann:
Ich würde ocpsoft / PrettyTime empfehlen (Unterstützung für tatsächlich 32 Sprachen (bald 34?), Die nur für die Arbeit mit geeignet sind
java.util.Date
- 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, sodass weitere Verbesserungen oder Verbesserungen der Daten eine Weile dauern können ...Wenn Sie mit Android arbeiten, ist die Hilfsklasse android.text.format.DateUtils eine schlanke integrierte Alternative (siehe andere Kommentare und Antworten hier, mit dem Nachteil, dass sie jahrelang und monatelang nicht unterstützt wird. Und das bin ich mir sicher Sehr wenige Leute mögen den API-Stil dieser Hilfsklasse.
Wenn Sie ein Fan von Joda-Time sind , können Sie sich die Klasse PeriodFormat ansehen (Unterstützung für 14 Sprachen in Release v2.9.4 auf der anderen Seite: Joda-Time ist sicherlich auch nicht kompakt, deshalb erwähne ich es hier nur für Vollständigkeit). Diese Bibliothek ist keine echte Antwort, da relative Zeiten überhaupt nicht unterstützt werden. Sie müssen mindestens das Literal "vor" anhängen (und alle unteren Einheiten manuell aus den generierten Listenformaten entfernen - umständlich). Im Gegensatz zu Time4J oder Android-DateUtils werden Abkürzungen oder das automatische Umschalten von relativen Zeiten auf absolute Zeitdarstellungen nicht speziell unterstützt. Wie PrettyTime ist es völlig abhängig von den unbestätigten Beiträgen privater Mitglieder der Java-Community zu ihren i18n-Daten.
quelle
Wenn Sie nach einem einfachen "Heute", "Gestern" oder "Vor x Tagen" suchen.
quelle
java.time
Verwenden des in Java 8 und höher integrierten java.time- Frameworks.
quelle
Duration
Methoden geben die gesamte Dauer als Gesamtzahl der Stunden und als Gesamtzahl der Minuten an. In Java 8 fehlten der Klasse seltsamerweise Methoden, um jeden Teil von Stunden, Minuten und Sekunden abzurufen. Java 9 bringt diese Methoden ,to…Part
.Ich habe einen einfachen Java-Timeago- Port des jquery-timeago- Plug- Ins erstellt, der genau das tut, wonach Sie fragen.
quelle
Wenn Sie eine App für Android entwickeln, bietet sie die Dienstprogrammklasse DateUtils für alle diese Anforderungen. Schauen Sie sich die Dienstprogrammmethode DateUtils # getRelativeTimeSpanString () an .
Aus den Dokumenten für
CharSequence getRelativeTimeSpanString (lange Zeit, lange jetzt, lange minResolution)
Sie werden Ihre werden vorbei
timestamp
wie Zeit undSystem.currentTimeMillis()
wie jetzt . MitminResolution
können Sie die Mindestzeitspanne für die Berichterstellung festlegen.quelle
Mit dieser Funktion können Sie die Zeit vor berechnen
1) Hier ist time_ago in Mikrosekunden
quelle
Basierend auf einer Reihe von Antworten hier habe ich Folgendes für meinen Anwendungsfall erstellt.
Anwendungsbeispiel:
quelle
Das Joda-Time- Paket hat den Begriff Perioden . Sie können mit Perioden und Datums- und Uhrzeitangaben rechnen.
Aus den Dokumenten :
quelle
Es ist nicht schön ... aber das Beste, was ich mir vorstellen kann, ist die Verwendung von Joda-Zeit (wie in diesem Beitrag beschrieben: Wie berechnet man die verstrichene Zeit von jetzt an mit Joda-Zeit?
quelle
Dies ist ein besserer Code, wenn wir die Leistung 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 werden nur berechnet, wenn die Anzahl der Minuten größer als 60 ist und so weiter ...
quelle
java.time
Die Antwort von Habsq hat die richtige Idee, aber die falschen Methoden.
Verwenden Sie für einen Zeitraum, der nicht an die Zeitachse in der Größenordnung von Jahren, Monaten und Tagen gebunden ist
Period
. Verwenden Sie für Tage, die 24-Stunden-Zeitabschnitte ohne Bezug zum Kalender und Stunden-Minuten-Sekunden bedeutenDuration
. Das Mischen der beiden Skalen macht selten Sinn.Duration
Beginnen Sie mit dem Abrufen des aktuellen Moments in UTC mithilfe der
Instant
Klasse.Generieren Sie Text für Stunden, Minuten und Sekunden.
Dump zur Konsole.
Period
Beginnen Sie mit dem Abrufen des aktuellen Datums.
Eine Zeitzone ist entscheidend für die Bestimmung eines Datums. Für jeden Moment variiert das Datum weltweit je nach Zone. Zum Beispiel ist ein paar Minuten nach Mitternacht in Paris Frankreich ein neuer Tag, während es noch „gestern“ in Montréal Québec ist .
Wenn keine Zeitzone angegeben ist, wendet die JVM implizit ihre aktuelle Standardzeitzone an. Diese Standardeinstellung kann sich jederzeit zur Laufzeit (!) Ändern , sodass Ihre Ergebnisse variieren können. Geben Sie Ihre gewünschte / erwartete Zeitzone besser explizit als Argument an. Wenn dies kritisch ist, bestätigen Sie die Zone mit Ihrem Benutzer.
Geben Sie einen richtigen Zeitzonennamen im Format
Continent/Region
, wie zum BeispielAmerica/Montreal
,Africa/Casablanca
oderPacific/Auckland
. Verwenden Sie niemals die Abkürzung für 2-4 Buchstaben, wie z. B.EST
oder,IST
da es sich nicht um echte Zeitzonen handelt, die nicht standardisiert und nicht einmal eindeutig (!) Sind.Erstellen Sie ein Datum vor acht Tagen, Monaten und Jahren neu.
Verstrichene Zeit berechnen.
Bauen Sie die Kette von "vor langer Zeit" Stücken.
Dump zur Konsole.
Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie
java.util.Date
,Calendar
, &SimpleDateFormat
.Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für
java.sql.*
Klassen.Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden
Interval
,YearWeek
,YearQuarter
, und mehr .quelle
Nach langer Recherche habe ich das gefunden.
quelle
Für Android Genau wie Ravi sagte, aber da viele Leute einfach kopieren wollen, fügen Sie das Ding hier ein.
Erklärung für Leute, die mehr Zeit haben
Ex. Ich erhalte die Daten von einem Server im Format Mi, 27 Jan 2016 09:32:35 GMT [dies ist wahrscheinlich NICHT Ihr Fall]
dies wird übersetzt in
SimpleDateFormat-Formatierer = neues SimpleDateFormat ("EEE, TT MMM JJJJ HH: MM: SS Z");
woher weiß ich das Lesen Sie hier die Dokumentation.
Dann, nachdem ich es analysiert habe, bekomme ich ein Date. Dieses Datum habe ich in den getRelativeTimeSpanString eingegeben (ohne zusätzliche Parameter ist es für mich in Ordnung, standardmäßig Minuten zu verwenden).
Sie erhalten eine Ausnahme, wenn Sie nicht die richtige Analysezeichenfolge gefunden haben. So etwas wie: Ausnahme bei Zeichen 5 . Schauen Sie sich Zeichen 5 an und korrigieren Sie Ihre anfängliche Analysezeichenfolge. . Möglicherweise erhalten Sie eine weitere Ausnahme. Wiederholen Sie diese Schritte, bis Sie die richtige Formel gefunden haben.
quelle
}}
Anruf
val String = timeAgo (unixTimeStamp)
um die Zeit vor in Kotlin zu bekommen
quelle
Hier ist meine Java-Implementierung davon
quelle
Für mich geht das
quelle
Dies ist das sehr grundlegende Skript. Es ist leicht zu improvisieren.
Ergebnis: (vor XXX Stunden) oder (vor XX Tagen / Gestern / Heute)
quelle
Dafür habe ich
Just Now, seconds ago, min ago, hrs ago, days ago, weeks ago, months ago, years ago
in diesem Beispiel das Datum wie2018-09-05T06:40:46.183Z
dieses oder ein anderes wie das folgende analysiertFügen Sie den folgenden Wert in string.xml hinzu
Java-Code versuchen Sie unten
quelle
Sie können Javas Library RelativeDateTimeFormatter verwenden , genau das tut es:
quelle
Ich verwende Instant, Date und DateTimeUtils. Die Daten (Datum), die in der Datenbank in Form eines Strings gespeichert und dann in Instant konvertiert werden.
quelle
Die folgenden Lösungen sind alle in reinem Java:
Option 1: Keine Rundung und nur größter Zeitcontainer
Die folgende Funktion zeigt nur den größten Zeitcontainer an. Wenn beispielsweise die tatsächlich verstrichene Zeit ist
"1 month 14 days ago"
, wird diese Funktion nur angezeigt"1 month ago"
. Diese Funktion wird auch immer abgerundet, sodass eine Zeit entsprechend"50 days ago"
angezeigt wird als"1 month"
Option 2: Mit Rundung
Wickeln einfach die Zeit Container , den Sie mit einem Math.round (...) Aussage Runde möchten, wenn Sie also zu Runde wollte
50 days
zu2 months
, ändernlong months = days / 30
zulong months = Math.round(days / 30.0)
quelle
Duration
mit seinento…Part
Methoden wäre viel einfacher, wie in meiner Antwort gezeigt .Hier ist mein Testfall, hoffe es hilft:
quelle
Calendar
Klasse wurde vor Jahren durch die modernen Java.time- Klassen mit der Einführung von JSR 310 ersetzt . Schlechter Rat im Jahr 2019.var
, nichtval
.Die Funktion getrelativeDateTime gibt Ihnen die Datums- und Uhrzeitangabe an , wie Sie in der WhatsApp-Benachrichtigung sehen.
Um zukünftige relative Datums- und Uhrzeitangaben zu erhalten, fügen Sie Bedingungen dafür hinzu. Dies wurde speziell für das Abrufen von Datum und Uhrzeit wie WhatsApp-Benachrichtigungen erstellt.
quelle
SimpleDateFormat
undCalendar
trotzdem. Diese Klassen sind schlecht gestaltet und längst veraltet. Lesen Sie stattdessen die Antworten, die java.time verwenden, die moderne Java-API für Datum und Uhrzeit.