web-dev-qa-db-fra.com

Time: Comment arriver le vendredi prochain?

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.

50
michael.kebe

Java.time

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));
}
58
michael.kebe

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

52
Esko

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

5
fvu
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
}
4
dinesh pazani

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 <.

4
Adam Gent

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);
}
3
Stefan Haberl

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()));
    }
}
0
Breton F.