web-dev-qa-db-de.com

Das Datum der aktuellen Woche vom Montag abrufen

Wir haben ein Dienstprogramm, das jeden Tag von Montag bis Freitag ausgeführt wird. Es werden einige Dateien in einem Content Management Tool aktualisiert. Das letzte Änderungsdatum, das dieser Datei zugeordnet ist, sollte das Montagdatum dieser Woche sein. Ich habe das folgende Programm geschrieben, um das Datum der aktuellen Woche abzurufen. Ich bin mir immer noch nicht sicher, ob dies für alle Szenarien funktionieren würde. Hat jemand eine bessere Lösung?

Calendar c = Calendar.getInstance();
c.setTime(new Date());
System.out.println(c.get(Calendar.DAY_OF_MONTH));
System.out.println(c.get(Calendar.DAY_OF_WEEK));
int mondayNo = c.get(Calendar.DAY_OF_MONTH)-c.get(Calendar.DAY_OF_WEEK)+2;
c.set(Calendar.DAY_OF_MONTH,mondayNo);
System.out.println("Date "+c.getTime());
23
Shashank Kadne

Ich würde dringend empfehlen, stattdessen Joda-Zeit zu verwenden (für all Ihre Datums-/Zeitarbeit, nicht nur dies):

_// TODO: Consider time zones, calendars etc
LocalDate now = new LocalDate();
LocalDate monday = now.withDayOfWeek(DateTimeConstants.MONDAY);
System.out.println(monday);
_

Beachten Sie, dass, da Sie hier Montag verwendet haben, der der erste Tag der Woche in der Joda - Zeit ist, dies immer einen früheren Tag (oder den früheren Tag) zurückgibt gleicher Tag). Wenn Sie zum Beispiel Mittwoch gewählt haben, wird von Montag oder Dienstag auf Mittwoch vorgerückt . Sie können eine Woche immer addieren oder subtrahieren, wenn Sie "den nächsten Mittwoch" oder "den vorherigen Mittwoch" benötigen.

BEARBEITEN: Wenn Sie wirklich Java.util.Date/Calendar verwenden möchten, können Sie Folgendes verwenden:

_Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());
_

Sie können Calendar.setFirstDayOfWeek verwenden, um anzugeben, ob eine Woche Montag-Sonntag oder Sonntag-Samstag ist. Ich glaube , dass das Einstellen des Wochentags innerhalb der aktuellen Woche bleibt - aber teste es.

47
Jon Skeet

tl; dr

LocalDate previousMonday = 
    LocalDate.now( ZoneId.of( "America/Montreal" ) )
             .with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) );

Java.time

Sowohl die Java.util.Calendar-Klasse als auch die Joda-Time-Bibliothek wurden durch das in Java 8 und höher integrierte Java.time Framework ersetzt. Siehe Oracle Tutorial . Ein Großteil der Java.time-Funktionalität wurde auf Java 6 & 7 in ThreeTen-Backport zurückportiert und weiter auf Android in ThreeTenABP .

Die Klasse Java.time.LocalDate repräsentiert einen Datumswert ohne Uhrzeit und ohne Zeitzone.

Die Bestimmung des heutigen Datums erfordert eine Zeitzone, a ZoneId .

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );

Die Schnittstelle TemporalAdjuster (siehe Tutorial ) ist eine leistungsstarke, aber einfache Möglichkeit, Datums- und Uhrzeitwerte zu bearbeiten. Die Klasse TemporalAdjusters (beachte den Plural) implementiert einige sehr nützliche Anpassungen. Hier verwenden wir previous( DayOfWeek) .

Mit der praktischen Enumeration DayOfWeek können Sie ganz einfach einen Wochentag angeben.

LocalDate previousMonday = today.with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) );

Wenn heute ist Montag ist und Sie heute statt vor einer Woche verwenden möchten, rufen Sie previousOrSame auf.


About Java.time

Das Java.time Framework ist in Java 8 und höher integriert. Diese Klassen ersetzen die lästigen alten Legacy Datum-Zeit-Klassen wie Java.util.Date , Calendar , & - SimpleDateFormat .

Das Joda-Time -Projekt, das sich jetzt im Wartungsmodus befindet, rät zur Migration in die Java.time -Klassen.

Weitere Informationen finden Sie im Oracle Tutorial . Durchsuchen Sie Stack Overflow nach vielen Beispielen und Erklärungen. Spezifikation ist JSR 31 .

Sie können Java.time Objekte direkt mit Ihrer Datenbank austauschen. Verwenden Sie einen JDBC-Treiber , der JDBC 4.2 oder höher entspricht. Keine Notwendigkeit für Zeichenketten, keine Notwendigkeit für Klassen Java.sql.*.

Woher bekommen Sie die Java.time-Klassen?

Das Projekt ThreeTen-Extra erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von Java.time. Hier finden Sie möglicherweise einige nützliche Klassen wie Interval , YearWeek , YearQuarter und mehr .

18
Basil Bourque

Das Folgende wird funktionieren, einschließlich der Umreifungsmonate:

Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setTime(new Date());
int today = c.get(Calendar.DAY_OF_WEEK);
c.add(Calendar.DAY_OF_WEEK, -today+Calendar.MONDAY);
System.out.println("Date "+c.getTime());

Wenn Sie Ihre Bewerbung jedoch an einem Sonntag (z. B. Sonntag, 12. Februar) bearbeiten, wird das Datum am folgenden Montag sein. Je nach Ihren Anforderungen (die App wird nur von Montag bis Freitag ausgeführt), sollte dies kein Problem darstellen.

6
radimpe

Wie Jon vorschlug, funktioniert die calendar.set-Methode ....... Ich habe sie sowohl im Fall eines Montags im selben Monat als auch in einem anderen Monat mit folgendem Snippet getestet:

Calendar c = Calendar.getInstance();
//ensure the method works within current month
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());
//go to the 1st week of february, in which monday was in january
c.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("Date " + c.getTime());
//test that setting day_of_week to monday gives a date in january
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());
//same for tuesday
c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
System.out.println("Date " + c.getTime());

Die Ergebnisse:

Date Mon Feb 13 10:29:41 CET 2012
Date Wed Feb 01 10:29:41 CET 2012
Date Mon Jan 30 10:29:41 CET 2012
Date Tue Jan 31 10:29:41 CET 2012
2
Simon Baslé

Was ist mit der Joda Time -Bibliothek? Schauen Sie sich diese answer an ...

1
PrimosK

Für die Version Android 6.0 oder Reibe verwenden Sie:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
int day = 8, month = 2, year = 2019;
Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
//set the date with your date or the current date c.set(new Date());
c.set(year, month, day);
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);  //change de day to monday
String dateMonday= sdf.format(c.getTime());

Für die Version Android 5.1 oder weniger funktioniert es nicht richtig, ich habe meine eigene Methode erstellt.

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
int day = 8, month = 2, year = 2019;
Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
//set the date with your date or the current date c.set(new Date());
c.set(year, month, day);

int diaSemana = c.get(Calendar.DAY_OF_WEEK);
for (int i = 0; i < 7; i++) {
   if (diaSemana != Calendar.MONDAY) {
     if (day > 2) {
       day--;
       c.set(year, month, day);
       diaSemana = c.get(Calendar.DAY_OF_WEEK);
     } else {
       if (month > 0) {
       month--;
       c.set(year, month, 1);
       day = c.getActualMaximum(Calendar.DAY_OF_MONTH);
       c.set(year, month, day);
     } else {
       month = 12;
       year--;
       c.set(year, month, 31);
     }
     diaSemana = c.get(Calendar.DAY_OF_WEEK);
    }
   } else {
   break;
   }
 }
String dateMonday= sdf.format(c.getTime());
0
Adolfo Rangel

wenn Sie Joda Time nicht verwenden möchten, können Sie dies tun, um die Wochen zu finden -> (funktioniert auf Android)

public static ArrayList<String> getWeeks(int month) {

ArrayList<String> arrayListValues = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("MMMM d");

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.MONTH, month);

int day = calendar.get(Calendar.DAY_OF_WEEK);
while (day != 1) {
  calendar.add(Calendar.DATE, 1);
  day = calendar.get(Calendar.DAY_OF_WEEK);
}

calendar.add(Calendar.DATE, -14);
String y1 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 6);
String y2 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 1);
arrayListValues.add(y1 + " - " + y2);

 y1 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 6);
 y2 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 1);
arrayListValues.add(y1 + " - " + y2);



for (int i = 0; i < 10; i++) {

  y1 = sdf.format(calendar.getTime());
  calendar.add(Calendar.DATE, 6);
  y2 = sdf.format(calendar.getTime());
  calendar.add(Calendar.DATE, 1);
  arrayListValues.add(y1 + " - " + y2);
}

return arrayListValues;
}
0
OWADVL