77 votes

Joda-Time: Comment arriver le vendredi prochain?

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: S'il vous plaît, ne me conseillez pas d’utiliser la date et l’heure de JDK. Joda-Time est une API bien meilleure.

52voto

Esko Points 15578

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! :)

5voto

fvu Points 21471

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é ;-)

4voto

Adam Gent Points 15055

Je viens de perdre 30 minutes à essayer de comprendre cela par moi-même mais j'avais besoin de génériquement rouler vers l'avant.

De toute façon, 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, vous avez juste besoin de faire une Partielle (qui LocalDate est) pour le jour de la semaine.

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

Maintenant, quel que soit le plus important champ de l'partielle sera +1 si la date actuelle est après (aujourd'hui).

C'est si vous faites une partie Mars 2012, il va créer un nouveau type datetime de Mars 2013 ou <.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X