Heure: Comment obtenir le vendredi suivant?

Comment puis-je obtenir le vendredi suivant avec l’API Joda-Time ?

Le LocalDate d’aujourd’hui est today . Il me semble que vous devez décider quand vous êtes avant ou après le vendredi de la semaine en cours. Voir cette méthode:

 private LocalDate calcNextFriday(LocalDate d) { LocalDate friday = d.dayOfWeek().setCopy(5); if (d.isBefore(friday)) { return d.dayOfWeek().setCopy(5); } else { return d.plusWeeks(1).dayOfWeek().setCopy(5); } } 

Est-il possible de le faire plus court ou avec un oniner?

PS: S’il vous plaît, ne me conseillez pas d’utiliser les données de date / heure des JDK. Joda-Time est une API bien meilleure.

Java 8 introduit le package java.time ( Tutorial ) qui est encore meilleur.

Il est possible de le faire de manière beaucoup plus facile à lire:

 if (d.getDayOfWeek() < DateTimeConstants.FRIDAY) { return d.withDayOfWeek(DateTimeConstants.FRIDAY)); } else if (d.getDayOfWeek() == DateTimeConstants.FRIDAY) { // almost useless branch, could be merged with the one above return d; } else { return d.plusWeeks(1).withDayOfWeek(DateTimeConstants.FRIDAY)); } 

ou sous une forme un peu plus courte

 private LocalDate calcNextFriday(LocalDate d) { if (d.getDayOfWeek() < DateTimeConstants.FRIDAY) { d = d.withDayOfWeek(DateTimeConstants.FRIDAY)); } else { d = d.plusWeeks(1).withDayOfWeek(DateTimeConstants.FRIDAY)); } return d; // note that there's a possibility original object is returned } 

ou même plus court

 private LocalDate calcNextFriday(LocalDate d) { if (d.getDayOfWeek() >= DateTimeConstants.FRIDAY) { d = d.plusWeeks(1); } return d.withDayOfWeek(DateTimeConstants.FRIDAY); } 

PS Je n'ai pas testé le code actuel! 🙂

java.time

Avec le framework java.time intégré à Java 8 et ultérieur ( Tutorial ), vous pouvez utiliser les TemporalAdjusters pour obtenir le jour de la semaine suivant ou précédent .

 private LocalDate calcNextFriday(LocalDate d) { return d.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)); } 

Votre code en 1 ligne

 private LocalDate calcNextFriday3(LocalDate d) { return d.isBefore(d.dayOfWeek().setCopy(5))?d.dayOfWeek().setCopy(5):d.plusWeeks(1).dayOfWeek().setCopy(5); } 

Approche alternative

 private LocalDate calcNextDay(LocalDate d, int weekday) { return (d.getDayOfWeek() < weekday)?d.withDayOfWeek(weekday):d.plusWeeks(1).withDayOfWeek(weekday); } private LocalDate calcNextFriday2(LocalDate d) { return calcNextDay(d,DateTimeConstants.FRIDAY); } 

un peu testé 😉

J’ai juste perdu 30 minutes à essayer de comprendre cela, mais j’avais besoin de faire un pas en avant génériquement.

En tout cas voici ma solution:

 public static DateTime rollForwardWith(ReadableInstant now, AbstractPartial lp) { DateTime dt = lp.toDateTime(now); while (dt.isBefore(now)) { dt = dt.withFieldAdded(lp.getFieldTypes()[0].getRangeDurationType(), 1); } return dt; } 

Maintenant, il vous suffit de créer un Partial (qui est LocalDate) pour le jour de la semaine.

 Partial().with(DateTimeFieldType.dayOfWeek(), DateTimeConstants.FRIDAY); 

Maintenant, quel que soit le champ le plus significatif du partiel sera +1 si la date actuelle est après (maintenant).

C’est-à-dire que si vous effectuez une partie avec mars 2012, cela créera une nouvelle date et heure de mars 2013 ou <.

 import java.util.Calendar; private Calendar getNextweekOfDay(int weekOfDay) { Calendar today = Calendar.getInstance(); int dayOfWeek = today.get(Calendar.DAY_OF_WEEK); int daysUntilNextWeekOfDay = weekOfDay - dayOfWeek; if (daysUntilNextWeekOfDay == 0) daysUntilNextWeekOfDay = 7; Calendar nextWeekOfDay = (Calendar)today.clone(); nextWeekOfDay.add(Calendar.DAY_OF_WEEK, daysUntilNextWeekOfDay); return nextWeekOfDay; } // set alarm for next Friday 9am public void setAlarm() { Calendar calAlarm = getNextweekOfDay(Calendar.FRIDAY); calAlarm.set(Calendar.HOUR_OF_DAY, 9);//9am calAlarm.set(Calendar.MINUTE, 0); calAlarm.set(Calendar.SECOND, 0); scheduleAlarm(calAlarm);// this is my own method to schedule a pendingIntent } 

compter les octets @fvu réponse peut être raccourci encore plus pour:

 private LocalDate calcNextFriday(LocalDate d) { return d.plusWeeks(d.getDayOfWeek() < DateTimeConstants.FRIDAY ? 0 : 1).withDayOfWeek(DateTimeConstants.FRIDAY); }