Es ist in Ordnung, nur ein Datum pro Bereich zu speichern. Der Standardweg besteht darin, halboffene Bereiche zu verwenden, so dass jeder Bereich von einem gespeicherten Datum einschließlich zum nächsten Datum exklusiv geht.
Ich schlage vor, dass Sie Daten statt Strings speichern. Ich finde es natürlicher, das Datum immer dann zu formatieren, wenn eine Zeichenkette benötigt wird, als die Zeichenkette jedes Mal, wenn ein Datum benötigt wird, zu analysieren (und Ausnahmen von der Analyse zu berücksichtigen).
Ich empfehle von ganzem Herzen, die veralteten Klassen SimpleDateFormat
und Calendar
zu überspringen und the modern Java date and time API known as java.time
or JSR-310 zu verwenden. Letzteres ist so viel schöner zu arbeiten, wie Sie sehen werden.
Die LocalDate
Klasse von java.time
entspricht unserer Notwendigkeit, Daten ohne Tageszeit sehr schön zu speichern. Ein weiterer Vorteil ist, dass die toString
-Methode eine Zeichenkette wie 2017-10-06
erzeugt, das Format, das Sie in Ihrem JSON-Objekt verwenden, so dass ein expliziter Formatierer nicht mehr erforderlich ist (es ist wahrscheinlich kein Zufall: Das Format ist Teil des ISO 8601-Standards wird zunehmend für den Austausch von Datums- und Zeitinformationen verwendet, nicht zuletzt in JSON). Das Hinzufügen und Subtrahieren eines Tages und eines Monats geht mit LocalDate
natürlicher als mit Calendar
, solange Sie daran denken, dass jedes Mal ein neues Objekt erstellt wird.
// store only the start date of each range
List<LocalDate> allStartDates = new ArrayList<>();
// add 1 day ot the last end date to obtain the start day of the following range
LocalDate currentStartDate = LocalDate.of(2017, Month.NOVEMBER, 06).plusDays(1);
for (int i = 1; i <= 14; i++) {
allStartDates.add(currentStartDate);
currentStartDate = currentStartDate.minusDays(1).minusMonths(1);
}
for (int j = 1; j < allStartDates.size(); j++) {
JSONObject dateRange = new JSONObject();
// subtract 1 day from the start day of the following range
// to get the last day of this range
String endDate = allStartDates.get(j - 1).minusDays(1).toString();
dateRange.put("until", endDate);
System.out.println("to date:" + endDate);
String startDate = allStartDates.get(j).toString();
dateRange.put("since", startDate);
System.out.println("from date:" + startDate);
}
Ausgang ist:
to date:2017-11-06
from date:2017-10-06
to date:2017-10-05
from date:2017-09-05
to date:2017-09-04
from date:2017-08-04
to date:2017-08-03
from date:2017-07-03
to date:2017-07-02
from date:2017-06-02
to date:2017-06-01
from date:2017-05-01
to date:2017-04-30
from date:2017-03-30
to date:2017-03-29
from date:2017-02-28
to date:2017-02-27
from date:2017-01-27
to date:2017-01-26
from date:2016-12-26
to date:2016-12-25
from date:2016-11-25
to date:2016-11-24
from date:2016-10-24
to date:2016-10-23
from date:2016-09-23
Frage: Kann ich die moderne API mit meiner Java-Version verwenden?
Wenn Sie mindestens Java verwenden, können Sie.
Gibt es einen besonderen Grund, warum Sie immer noch mit den lange veralteten Klassen 'SimpleDateFormat' und' Calendar' kämpfen? [Die moderne Java-API für Datum und Uhrzeit, die als JSR-310 oder 'java.time' bekannt ist (https://docs.oracle.com/javase/tutorial/datetime/), ist so viel angenehmer, mit ihr zu arbeiten. Und noch mehr, wenn es um die arithmetische Berechnung geht. –
Was möchten Sie vor dem Bereich von 2017-05-01 bis 2017-06-01? Eine von 2017-04-30 bis 2017-05-31 ?? –