Comment puis-je obtenir le vendredi prochain avec le Joda-Time API.
La LocalDate
of today 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 une doublure?
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.
Java 8 introduit Java.time package ( Tutorial ) qui est encore meilleur.
Avec le framework Java.time intégré à Java 8 et ultérieur ( Tutorial ), vous pouvez utiliser TemporalAdjusters
pour obtenir suivant ou précédent _ { jour de la semaine } _.
private LocalDate calcNextFriday(LocalDate d) {
return d.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
}
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é ;-)
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
}
J'ai juste perdu 30 minutes à essayer de résoudre ce problème moi-même, mais je devais passer à la vitesse supérieure.
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 une Partielle (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, il 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 <.
compter les 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 anciennes versions de Java au cas où vous n'êtes pas autorisé à mettre à niveau votre version de Java vers Java8 ou une version ultérieure, ni d'utiliser une bibliothèque de dates Java standard en tant que jodatime.
Le nombre de jours à ajouter à votre date est donné par cette formule:
(7 + Calendar.FRIDAY - yourDateAsCalendar.get (Calendar.DAY_OF_WEEK))% 7
Notez également que cela peut ê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 donné. Quelques 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()));
}
}