Question

Comment puis-je obtenir le vendredi prochain avec l'API Joda-Time ?

Le LocalDate d'aujourd'hui est today. Il me semble que vous devez décider 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 oneliner?

PS: Ne me conseillez pas d’utiliser les informations de date / heure des JDK. Joda-Time est une API bien meilleure.

Java 8 introduit les java.time package ( tutoriel ) encore plus performant.

Était-ce utile?

La solution

java.time

Avec le cadre java.time intégré à Java 8 et versions ultérieures ( Didacticiel ), vous pouvez utiliser TemporalAdjusters pour obtenir next ou précédent jour de la semaine .

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

Autres conseils

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 réel! :)

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 résoudre ce problème moi-même, mais j'avais besoin de faire un pas en avant générique.

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

Il ne vous reste plus qu’à créer un Partial (LocalDate) pour le jour de la semaine.

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

Maintenant, quel que soit le champ le plus significatif du partiel, la valeur sera +1 si la date actuelle est postérieure (maintenant).

C’est-à-dire que si vous faites un partiel avec mars 2012, cela créera une nouvelle date / 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 octets @fvu answer peut être encore réduit à:

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

Une solution modulo simple qui devrait fonctionner avec la plupart des versions java antérieures au cas où vous n'êtes pas autorisé à mettre à jour votre version java vers java8 ou les versions ultérieures, ni d'utiliser une bibliothèque de dates java standard comme jodatime

Le nombre de jours à ajouter à votre date est donné par cette formule:

(7 + Calendar.FRIDAY - yourDateAsCalendar.get (Calendar.DAY_OF_WEEK))% 7

Notez que ceci peut également être généralisé pour n’importe quel jour de la semaine en modifiant le champ statique Calendar.FRIDAY en votre jour de la semaine. Certains extraits de code ci-dessous

public static void main(String[] args) {
    for (int i = 0; i < 15; i++) {

        Calendar cur = Calendar.getInstance();
        cur.add(Calendar.DAY_OF_MONTH, i);

        Calendar friday = Calendar.getInstance();
        friday.setTime(cur.getTime());
        friday.add(Calendar.DAY_OF_MONTH, (7 + Calendar.FRIDAY - cur.get(Calendar.DAY_OF_WEEK)) % 7);

        System.out.println(MessageFormat.format("Date {0} -> {1} ", cur.getTime(),  friday.getTime()));
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top