5 Stimmen

Java Kalender: Berechnen Sie das Startdatum und das Enddatum der vorherigen Woche

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.

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!

6voto

Sean Patrick Floyd Punkte 283617

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

4voto

jarnbjo Punkte 33136
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;
}

2voto

ZJ Lyu Punkte 331

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 };
}

0voto

maerics Punkte 141984

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.

-1voto

martin Punkte 1939

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));
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X