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