Ich habe folgende Methode, die ich gerne kürzer oder schneller machen würde, wenn nichts anderes. Bitte alle Kommentare sind willkommen:
Die Balg-Methode nimmt ein Datumsobjekt, formatiert es ("EEE hh: mma MMM d, yyyy") und ermittelt dann, ob das Datum heute oder gestern ist und dann, wenn es so ist, "(Gestern | Heute) hh: mma "formatierte Zeichenfolge.
%Vor%Du hast "alle Kommentare willkommen" geschrieben, also benutze ich joda-time. :)
Ich bin ein Fan von Daten und Zeiten auf die kurze und intelligente Art und Weise der letzten Anrufe des iPhone (ähnlich wie bei Google Wave-Posts). Das ist "hh: mm" wenn heute, "gestern" oder Name des Wochentags wenn & lt; 7 Tage, sonst yyyy-MM-dd .
%Vor%wo ich eine Reihe von SimpleDateFormat (wie weekdayFormat oben) verwende, um die Zeit zu den gewünschten Strings zu formatieren, und wo DateTime und DateMidnight joda-time-Klassen sind.
In diesen Fällen ist die Anzahl der verstrichenen Tage zwischen zwei DateTime: s weniger relevant als die Art, wie die Leute die Zeit definieren würden, die darüber spricht. Anstatt Tage zu zählen (oder Millisekunden, wie ich einige Leute gesehen habe), ist DateMidnight hier praktisch, obwohl andere Methoden genauso gut funktionieren würden. :)
Mein Verständnis der Frage ist eine einfache Methode zur Ausgabe wie folgt:
%Vor%Der Code unten funktioniert für mich, aber ich bin neu bei Android und vielleicht könnten andere darauf hinweisen, wenn der Code nicht robust ist. Im Code unter 'timeLong' ist die Zeit meiner Ereignisse in der Epoche (Millisekunden).
%Vor%Die Frage und die anderen Antworten ignorieren das entscheidende Problem der Zeitzone. Dieser Eingabezeichenfolge fehlt eine Zeitzone oder Offset von UTC . Daher wird diese Zeichenfolge analysiert, während angenommen wird, dass sie in der aktuellen Standardzeitzone der JVM ein Datum-Uhrzeit-Datum darstellt. Riskantes Geschäft als (a) diese Annahme möglicherweise falsch ist, und (b) dass Standard kann jederzeit ändern, auch während Laufzeit.
Die Frage und andere Antworten ignorieren ein anderes entscheidendes Problem: Locale
. Das Gebietsschema bestimmt die menschliche Sprache, die verwendet wird, um den Namen des Tages und den Namen des Monats während des Parsens (und des Generierens) aus der Eingabezeichenfolge zu übersetzen.
Wenn nicht angegeben, wird das aktuelle Standardgebietsschema der JVM für die Übersetzung verwendet. Genau wie bei der Zeitzone kann sich das Standard-Gebietsschema Ihrer JVM jederzeit ändern, sogar während der Laufzeit.
Geben Sie besser das gewünschte / erwartete Gebietsschema an.
Die Frage und die anderen Antworten verwenden die alten Datum-Zeit-Klassen, die sich als schlecht entworfen und mühsam erwiesen haben. Java 8 und höher hat das java.time -Rahmenwerk in deren Klassen die alten verdrängen.
Ihre Methode zum Analysieren einer Zeichenfolge beim Generieren einer neuen Zeichenfolge sollte in zwei Methoden aufgeteilt werden. Eine Methode sollte analysieren, um Datum-Uhrzeit-Objekte zu erhalten. Die Sekunde sollte Datum-Zeit-Objekte aufnehmen und die gewünschte String-Ausgabe generieren. Dann kann jeder einzeln verwendet werden. Und diese Herangehensweise führt uns davon ab, Strings als Datum-Zeit-Werte zu denken. Zeichenfolgen sind textuelle Darstellungen von Datums- und Uhrzeitwerten. Ihre Geschäftslogik sollte sich darauf konzentrieren, diese Datums- / Uhrzeitwerte als Objekte zu manipulieren und sich nicht auf Strings zu konzentrieren.
Wenn wir ein ZonedDateTime
in der Hand von der obigen Methode übergeben, können wir eine textuelle Repräsentation seines Datum-Zeit-Wertes unter Verwendung eines spezifizierten Gebietsschemas für die Übersetzung von Name des Tages und Monatsname erzeugen.
Um zu bestimmen, ob die Datum-Uhrzeit für heute oder gestern ist, interessiert uns nur der Datumsteil ohne Tageszeit. Dafür können wir die LocalDate
Klasse in java.time verwenden .
Üben Sie diese beiden Methoden aus.
Wählen Sie willkürlich eine Zeitzone von America/New_York
, wie in der Frage nicht angegeben.
Übrigens können Sie java.time bitten, den Ausgabe-String automatisch entsprechend den kulturellen Normen des Gebietsschemas zu formatieren, anstatt ein Format hart zu codieren.
%Vor%Dump zur Konsole.
%Vor%Eingabe: Sa 11:23 AM 6. Februar 2016 | zdt: 2016-02-06T11: 23-05: 00 [Amerika / New_York] | Sofort: 2016-02-06T16: 23: 00Z | Ausgabe: Heute 11:23 Uhr | outputPerLocale: 6. Februar 2016 11:23:00
Übrigens schlage ich vor, einen Platz vor dem AM
oder PM
zu setzen, um das Lesen zu erleichtern.
Dies ist eine erweiterte Version von Balus Implementierung von c.
Versuchen Sie dies, ich habe es mit joda-datatime2.2.jar und SimpleDateFormat
implementiert %Vor%Einfache Fälle zur Verwendung und zum Testen der Util-Klasse:
%Vor%