2017-06-12 3 views
0

Ich schaffe es easlily in Java zu tun 8:Java 7 - Wie bekomme ich den 4. Dienstag im Mai?

public static Date getFourthTuesdayOfMay(int year){ 
     LocalDate date = LocalDate.of(year, Month.MAY, 1); 
     LocalDate fourthTuesdayOfMay = date.with(dayOfWeekInMonth(4, DayOfWeek.TUESDAY)); 
     return Date.from(fourthTuesdayOfMay.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); 
    } 

Das Problem ist, ich es in Java 7 tun müssen, ... kann aber nicht herausfinden, wie.

Antwort ist:

Calendar date = Calendar.getInstance(); 
     date.set(Calendar.DAY_OF_WEEK,Calendar.TUESDAY); 
     date.set(Calendar.MONTH, Calendar.MAY); 
     date.set(Calendar.WEEK_OF_MONTH, 4); 
     date.set(Calendar.YEAR, year); 
     date.set(Calendar.HOUR, 0); 
     date.set(Calendar.MINUTE, 0); 
     date.set(Calendar.SECOND, 0); 
     date.set(Calendar.MILLISECOND, 0); 

     return date.getTime(); 
+2

Wenn Sie die Bibliothek [Joda-Time] (http://www.joda.org/joda-time/) verwenden, müssen Sie Ihren Code nicht viel ändern. – 4castle

+2

@ 4castle Oder [ThreeTen] (http://www.threeten.org/threetenbp/) –

+0

Sie können vom Anfang des Monats zum ersten Dienstag iterieren und dann 21 Tage hinzufügen, aber es wird viel einfacher zu verwenden sein eine Bibliothek wie oben erwähnt. – Jason

Antwort

0

in Java 7 braucht Kalender für eine reine Java-SE-Lösung zu verwenden. (Joda fast java sein 8.)

public static Date getFourthTuesdayOfMay(int year) { 
    Calendar calendar = Calendar.getInstance(); 
    int monthDay = 1; 
    calendar.set(year, Calendar.MAY, monthDay); 
    while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.TUESDAY) { 
     ++monthDay; 
     calendar.set(Calendar.DAY_OF_MONTH, monthDay); 
    } 
    // monthDay = 1, ..., 7 
    monthDay += 3 * 7; // At most 28 <= 31 
    calendar.set(Calendar.DAY_OF_MONTH, monthDay); 
    return calendar.getTime(); 
} 

das Gebietsschema nicht angegeben ist, man einen nicht-gregorianischen Kalender bekommen konnte, vielleicht so Locale.FRANCE zu getInstance hinzufügen. Die Schleife für den Wochentag könnte durch Modulo 7 verhindert werden, aber das ist nicht so lesbar.

+1

Sie löschen die Uhrzeit nicht. Außerdem scheint es ein bisschen übertrieben, all diese "get" - und "set" -Aufrufe in einer Schleife zu machen, wenn es so gemacht werden kann: 'calendar.set (year, Calendar.MAY, 1); calendar.add (Calendar.DAY_OF_MONTH, (Calendar.TUESDAY + 7 - calendar.get (Calendar.DAY_OF_WEEK))% 7 + 21); ', aber ich denke," lesbar "ist eine Frage der Meinung. – Andreas

+0

@Andreas wertvoller Kommentar; Ich bevorzuge den mehr funktionalen und knappen Stil auch in meinem Code. Aber es ist schwieriger zu kommentieren. Und negative modulo (+7) und so. Danke für die kürzere Version. –

Verwandte Themen