2017-05-22 7 views
0

Ich habe einige Code, der die aktuelle Woche und lädt sie in ein Array bekommt:Android bekommen vergangenen Woche Termine

DateFormat format = new SimpleDateFormat("M-dd"); 
calendar = Calendar.getInstance(); 
calendar.setFirstDayOfWeek(Calendar.SUNDAY); 
calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); 

days = new String[7]; 
for (int i = 0; i < 7; i++) 
{ 
calendar.add(Calendar.DATE, 1); 
days[i] = format.format(calendar.getTime()); 
} 

ich dann einen Code haben, der auf die Auswahl einer Schaltfläche ausgeführt wird, die in der vergangenen Woche abruft ein Array Daten und lädt sie in:

DateFormat format = new SimpleDateFormat("M-dd"); 

days = new String[7]; 

for (int i = 0; i < 7; i++) 
{ 
calendar.add(Calendar.DATE, -1); 
days[i]=format.format(calendar.getTime()); 
} 

Mein Problem ist, dass es zum Beispiel geladen werden kann: 5-22-17, 5-23-17, 5-24-17, 5-25-17, 5 -26-17, 5-27-17, 5-28-17 in die Anfangslast für die erste Woche und dann, wenn ich auf meine Previous-Taste klicke, um den vorherigen Tastencode auszuführen, geht es nur zurück 1 Tag: 5-21-17 - 5-27-17. Wenn ich es noch einmal anklicke, geht es eine ganze Woche zurück: 5-14-17 - 5-20-17.

Wie kann ich meinen Code beheben in der vergangenen Woche Tage korrekt auf dem ersten Klick abzurufen?

+0

Ist das nicht der Wert von 'calendar' am Ende der ersten Anzeige' 5-28'? Und dann rennst du 7 Mal und subtrahierst von '5-28 '(was dich zu 5-21 bringt). Sie laufen dann erneut und subtrahieren von 5-21? Das Problem ist also, dass Sie den Beginn der Woche in einem separaten "Kalender" -Objekt halten sollten? – KevinO

Antwort

2

Zuerst stellen Sie ersten Tag der Woche bis Sonntag, aber Sie fügen Sie dann 1 vor ersten Wert bekommen, so ergibt sie Mon 5/22 zu Sun 5/28, nicht Sun 5/21 zu Sat 5/27.

Zweitens, wenn die erste Schleife erfolgt, wird das Kalender-Objekt bei 5/28 sitzen. Sie gehen dann nach hinten, 1 vor letzten Wert subtrahiert bekommen, so ergibt sich 5/27nach unten-5/21, nicht 5/21 zu 5/27 wie Sie gesagt haben.

Das Calendar-Objekt bei 5/21 Blättern sitzt. Wiederholen der obigen, erhalten Sie 5/20 bis 5/14, nicht 5/14 zu 5/20.

Also, um Ihre Ergebnisse als eine Woche von Sonntag bis Samstag, wie Sie dem Kalender, den Sie wollten, sagte, fügen Sie 1 nach den Wert zu bekommen. Und um eine Woche in der richtigen Reihenfolge zu bekommen, holen Sie sie immer inkrementell. Um zur vorherigen Woche zurückzukehren, seit der Kalender nach die Woche sitzt, gehen Sie 2 Wochen zurück, um mit dem Aufbau der vorherigen Woche zu beginnen.

public class Test { 
    private Calendar calendar; 
    public String[] getCurrentWeek() { 
     this.calendar = Calendar.getInstance(); 
     this.calendar.setFirstDayOfWeek(Calendar.SUNDAY); 
     this.calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); 
     return getNextWeek(); 
    } 
    public String[] getNextWeek() { 
     DateFormat format = new SimpleDateFormat("M-dd"); 
     String[] days = new String[7]; 
     for (int i = 0; i < 7; i++) { 
      days[i] = format.format(this.calendar.getTime()); 
      this.calendar.add(Calendar.DATE, 1); 
     } 
     return days; 
    } 
    public String[] getPreviousWeek() { 
     this.calendar.add(Calendar.DATE, -14); 
     return getNextWeek(); 
    } 
    public static void main(String[] args) { 
     Test t = new Test(); 
     System.out.println("Current : " + Arrays.toString(t.getCurrentWeek())); 
     System.out.println("Previous: " + Arrays.toString(t.getPreviousWeek())); 
     System.out.println("Previous: " + Arrays.toString(t.getPreviousWeek())); 
     System.out.println("Next : " + Arrays.toString(t.getNextWeek())); 
     System.out.println("Next : " + Arrays.toString(t.getNextWeek())); 
    } 
} 

Ausgabe

Current : [5-21, 5-22, 5-23, 5-24, 5-25, 5-26, 5-27] 
Previous: [5-14, 5-15, 5-16, 5-17, 5-18, 5-19, 5-20] 
Previous: [5-07, 5-08, 5-09, 5-10, 5-11, 5-12, 5-13] 
Next : [5-14, 5-15, 5-16, 5-17, 5-18, 5-19, 5-20] 
Next : [5-21, 5-22, 5-23, 5-24, 5-25, 5-26, 5-27] 
1

Ich glaube, das Problem ist die Tatsache, die calendar voran und Rückzug, anstatt als Anker verwendet werden. Dieser Code zeigt einen Ansatz zur Handhabung der Situation. Es behält den aktuellen Beginn der Woche bei und erhält ab diesem Zeitpunkt Tage.

/** 
* Returns 7 days starting from the specified starting date 
*/ 
private static String[] getDays(Calendar starting) 
{ 
    DateFormat format = new SimpleDateFormat("M-dd"); 
    String[] days = new String[7]; 
    Calendar mod = Calendar.getInstance(); 
    mod.setTime(starting.getTime()); 

    for (int i = 0; i < days.length; ++i) { 
     mod.add(Calendar.DATE, 1); 
     days[i] = format.format(mod.getTime()); 
    } 

    return days; 
} 

public static void main(String[] args) 
{ 
    // this sets to the beginning of the current week 
    Calendar cal = Calendar.getInstance(); 
    cal.setFirstDayOfWeek(Calendar.SUNDAY); 
    cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); 

    // need this to back up 
    Calendar beginningOfWeek = cal; 

    // generate the array 
    String days[] = getDays(beginningOfWeek); 

    System.out.println(Arrays.toString(getDays(beginningOfWeek))); 

    // go forward one week 
    beginningOfWeek.add(Calendar.DATE, 7); 
    System.out.println(Arrays.toString(getDays(beginningOfWeek))); 


    // go back one week; same as starting 
    beginningOfWeek.add(Calendar.DATE, -7); 
    System.out.println(Arrays.toString(getDays(beginningOfWeek))); 

    // go back one week; one week before we began 
    beginningOfWeek.add(Calendar.DATE, -7); 
    System.out.println(Arrays.toString(getDays(beginningOfWeek))); 

} 

Beispiel Ausgang:

[5-22, 5-23, 5-24, 5-25, 5-26, 5-27, 5-28]
[5- 29, 5-30, 5-31, 6-01, 6-02, 6-03, 6-04]
[5-22, 5-23, 5-24, 5-25, 5-26, 5 -27, 5-28]
[5-15, 5-16, 5-17, 5-18, 5-19, 5-20, 5-21]

Hinweis gibt es mehrere Optimierungen, könnte sein pplied, wie nicht die format jedes Mal erstellen, wenn die getDays(...) Methode aufgerufen wird. Auch die Variablennamen stammen im Wesentlichen vom OP, sind aber vielleicht nicht optimal.

Verwandte Themen