Was ist der bequemste und schnellste Weg, um Start- und Enddaten der vorherigen Woche zu erhalten? Beispiel: Heute ist der 12.10.2011 (Eingabedatum), aber ich möchte den 03.10.2011 (Datum des Montags der Vorwoche) und den 09.10.2011 (Datum des Sonntags der Vorwoche) erhalten.
Antworten
Zu viele Anzeigen?Hier ist eine weitere JodaTime-Lösung. Da du anscheinend nur Datumsangaben möchtest (keine Zeitstempel), würde ich die DateMidnight-Klasse verwenden:
final DateTime input = new DateTime();
System.out.println(input);
final DateMidnight startOfLastWeek =
new DateMidnight(input.minusWeeks(1).withDayOfWeek(DateTimeConstants.MONDAY));
System.out.println(startOfLastWeek);
final DateMidnight endOfLastWeek = startOfLastWeek.plusDays(6);
System.out.println(endOfLastWeek);
Ausgabe:
2011-10-12T18:13:50.865+02:00
2011-10-03T00:00:00.000+02:00
2011-10-10T00:00:00.000+02:00
public static Calendar firstDayOfLastWeek(Calendar c) {
c = (Calendar) c.clone();
// letzte Woche
c.add(Calendar.WEEK_OF_YEAR, -1);
// erster Tag
c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek());
return c;
}
public static Calendar lastDayOfLastWeek(Calendar c) {
c = (Calendar) c.clone();
// erster Tag dieser Woche
c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek());
// letzter Tag der vorherigen Woche
c.add(Calendar.DAY_OF_MONTH, -1);
return c;
}
Ich würde mich für die Antwort von @maerics entscheiden, wenn keine Bibliothek von Drittanbietern involviert ist. Ich muss die Methode roll() durch die Methode add() ersetzen, da roll das höhere Feld unverändert lässt. z.B., der 22. August wird durch das Zurückrollen um -7 Tage vom 1. August erhalten. Beachten Sie, dass der Monat unverändert bleibt. Der Quellcode sieht wie folgt aus.
public static Calendar[] getLastWeekBounds(Calendar c) {
int cdow = c.get(Calendar.DAY_OF_WEEK);
Calendar lastMon = (Calendar) c.clone();
lastMon.add(Calendar.DATE, -7 - (cdow - Calendar.MONDAY));
Calendar lastSun = (Calendar) lastMon.clone();
lastSun.add(Calendar.DATE, 6);
return new Calendar[] { lastMon, lastSun };
}
Sie können die Calendar.roll(int,int)
-Methode mit den Argumenten Calendar.DATE
und einem Offset für den aktuellen Wochentag verwenden:
public static Calendar[] getLastWeekBounds(Calendar c) {
int cdow = c.get(Calendar.DAY_OF_WEEK);
Calendar lastMon = (Calendar) c.clone();
lastMon.roll(Calendar.DATE, -7 - (cdow - Calendar.MONDAY));
Calendar lastSun = (Calendar) lastMon.clone();
lastSun.roll(Calendar.DATE, 6);
return new Calendar[] { lastMon, lastSun };
}
Diese Funktion gibt ein Array von zwei Calendars zurück, wobei der erste der Montag der letzten Woche und der Sonntag der letzten Woche ist.
Wow, die Java-Datums-APIs sind schrecklich.
Mit Joda verwenden:
DateTime input;
DateTime startOfLastWeek = input.minusWeeks(1).minusDays(input.getDayOfWeek()-1);
DateTime endOfLastWeek = input.minusWeeks(1).plusDays(input.getDayOfWeek()+1);
DateTime endOfLastWeek = startOfLastWeek.plusDays(6);
BEARBEITEN:
Joda erlaubt keine unterschiedlichen ersten Wochentage, sondern hält sich strikt an den ISO-Standard, der besagt, dass eine Woche immer am Montag beginnt. Wenn Sie dies jedoch konfigurierbar machen müssen, könnten Sie den gewünschten ersten Tag der Woche als Parameter übergeben. Sehen Sie sich den obigen Link für einige andere Ideen an.
public DateTime getFirstDayOfPreviousWeek(DateTime input)
{
return getFirstDayOfPreviousWeek(input, DateTimeConstants.MONDAY);
}
public DateTime getFirstDayOfPreviousWeek(DateTime input, int firstDayOfWeek)
{
return new DateTime(input.minusWeeks(1).withDayOfWeek(firstDayOfWeek));
}
public DateTime getLastDayOfPreviousWeek(DateTime input)
{
return getLastDayOfPreviousWeek(input, DateTimeConstants.MONDAY);
}
public DateTime getLastDayOfPreviousWeek(DateTime input, int firstDayOfWeek)
{
return new DateTime(getFirstDayOfPreviousWeek(input, firstDayOfWeek).plusDays(6));
}
- See previous answers
- Weitere Antworten anzeigen
1 Stimmen
Du solltest dafür Joda (joda-time.sourceforge.net) verwenden, es ist viel einfacher für solche Anwendungsfälle als die integrierten Klassen von Java.
0 Stimmen
Auch Joda-Time ist bewährt. Prost!