Wie überprüft man, ob das angegebene Datum früher ist als vor einem Monat? Was ist der schnellste Algorithmus? Ich muss berücksichtigen, dass verschiedene Monate unterschiedliche Anzahl von Tagen haben.
Der moderne Ansatz verwendet die Klassen java.time und nicht die problematischen Legacy-Klassen wie Date
& amp; Calendar
.
Erhalte zuerst das aktuelle Datum. Die Klasse LocalDate
repräsentiert einen reinen Datumswert ohne Zeit. des Tages und ohne Zeitzone.
Eine Zeitzone ist entscheidend für die Bestimmung eines Datums. Für jeden Moment variiert das Datum von Zone zu Zone. Zum Beispiel, ein paar Minuten nach Mitternacht in Paris Frankreich ist ein neuer Tag während noch "gestern" in Montréal Québec .
Geben Sie einen richtigen Zeitzonennamen im Format continent/region
an, z. B. America/Montreal
, Africa/Casablanca
oder Pacific/Auckland
. Verwenden Sie niemals die Abkürzung für 3-4 Buchstaben wie EST
oder IST
, da sie keine echten Zeitzonen sind, nicht standardisiert und nicht einmal eindeutig (!).
Bestimmen Sie als Nächstes das Datum vor einem Monat .
%Vor% Hier sind die Regeln, die von LocalDate::minusMonths
Diese Methode subtrahiert den angegebenen Betrag in drei Schritten vom Feld "Monate":
Subtrahieren Sie die Eingabemonate vom Feld für den Monat des Jahres
Überprüfen Sie, ob das resultierende Datum ungültig ist
Passen Sie gegebenenfalls den Tag des Monats dem letzten gültigen Tag an
Zum Beispiel würde 2007-03-31 minus ein Monat zu dem ungültigen Datum 2007-02-31 führen. Anstatt ein ungültiges Ergebnis zurückzugeben, wird stattdessen der letzte gültige Tag des Monats 2007-02-28 ausgewählt.
Oder vielleicht meinen Sie in Ihren Geschäftsregeln "30 Tage" anstelle eines Kalendermonats.
%Vor% Sie erhalten ein Datum. Dies sollte als LocalDate
-Objekt an Ihren Code übergeben werden.
Wenn Sie von einem String kommen, verwenden Sie die Standardformate ISO 8601 . Suchen Sie für andere Formate Stack Overflow nach DateTimeFormatter
class.
Vergleichen Sie jetzt. Rufen Sie die isBefore
, isEqual
, isAfter
Methoden.
Was die in der Frage aufgeworfene Frage der Leistung betrifft: Mach dir keine Sorgen. In diesem Monat ist die Berechnung und der Vergleich sehr wahrscheinlich kein Engpass in Ihrer App. Vermeiden Sie vorzeitige Optimierung .
Das Framework java.time ist in Java integriert 8 und später. Diese Klassen ersetzen die problematischen alten Legacy Datum-Uhrzeit-Klassen wie java.util.Date
, Calendar
, & amp; SimpleDateFormat
.
Das Joda-Time Projekt, jetzt in Wartungsmodus , rät Migration zum java.time Klassen.
Weitere Informationen finden Sie im Oracle-Lernprogramm . Und suchen Sie nach Stack Overflow für viele Beispiele und Erklärungen. Spezifikation ist JSR 310 .
Wo erhalten Sie die Klassen java.time?
Das ThreeTen-Extra -Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von java.time. Hier finden Sie einige nützliche Klassen wie Interval
, < a href="http://www.threeten.org/threeten-extra/apidocs/org/threeten/extra/YearWeek.html"> YearWeek
, YearQuarter
und mehr .