2017-11-06 3 views
-2

Ich möchte den Datumsbereich für eine bestimmte Liste von Monaten finden. Der Code, den ich geschrieben habe, istSo finden Sie Zeiträume für angegebene Monate

List<String> allDates = new ArrayList<>(); 
       String maxDate = "2017-11-06"; 
       SimpleDateFormat monthDate = new SimpleDateFormat("yyyy-MM-dd"); 
       Calendar cal = Calendar.getInstance(); 
       cal.setTime(monthDate.parse(maxDate)); 

      for (int i = 1; i <= 14; i++) { 
        String month_name1 = monthDate.format(cal.getTime()); 
        allDates.add(month_name1); 
        cal.add(Calendar.MONTH, -1); 
       } 
       for (int j = 0; j < allDates.size() - 1; j++) { 
        JSONObject dateRange = new JSONObject(); 
        dateRange.put("until", allDates.get(j)); 
        System.out.println("to date:"+allDates.get(j)); 
        dateRange.put("since", allDates.get(j + 1)); 
        System.out.println("from date:"+ allDates.get(j + 1)); 

       } 

Hier bin ich immer:

to date:2017-11-06 
from date:2017-10-06 
to date:2017-10-06 
from date:2017-09-06 
to date:2017-09-06 
from date:2017-08-06 
to date:2017-08-06 
from date:2017-07-06 
to date:2017-07-06 
from date:2017-06-06 
to date:2017-06-06 

Aber ich möchte in diesem Format:

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 
+1

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. –

+0

Was möchten Sie vor dem Bereich von 2017-05-01 bis 2017-06-01? Eine von 2017-04-30 bis 2017-05-31 ?? –

Antwort

1

Sie speichern nur eine Saite pro Monat in Ihrem allDates Liste und versuchen, es als „to date“ zu verwenden, und „von Datum“, die in gleichen String für beide Termine enden wird. Sie sollten für jeden zu & ab Datum zwei verschiedene Zeichenfolgen hinzufügen. Ich habe Ihre Loops entsprechend modifiziert:

for (int i = 1; i <= 14; i++) {    
     String month_name1 = monthDate.format(cal.getTime());    
     allDates.add(month_name1); 
     cal.add(Calendar.MONTH, -1); 
     month_name1 = monthDate.format(cal.getTime()); 
     allDates.add(month_name1);    
     cal.add(Calendar.DATE, -1); 
    } 
    for (int j = 0; j < allDates.size() - 1; j+=2) { 
     JSONObject dateRange = new JSONObject(); 
     dateRange.put("until", allDates.get(j)); 
     System.out.println("to date:"+allDates.get(j)); 
     dateRange.put("since", allDates.get(j + 1)); 
     System.out.println("from date:"+ allDates.get(j + 1)); 
    } 
0

Basierend auf Ihre erwartete Liste, Sie wollen auch Verringern Sie das Datum. Sie müssen also das Inkrement für Ihr DATUM hinzufügen.

cal.add(Calendar.DATE, -1); 
+0

Ich versuchte das auch ... bis zum Datum: 2017-11-06 von Datum: 2017-10-05 bis Datum: 2017-10-05 von Datum: 2017-09-04 bis heute: 2017-09- 04 von Datum: 2017-08-03 –

1

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.

Verwandte Themen