2009-10-28 4 views
45

Comment puis-je obtenir le vendredi suivant avec l'API Joda-Time.Heure: Comment obtenir le vendredi suivant?

Le LocalDate d'aujourd'hui est today. Il me semble que vous devez décider où 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 oneliner? PS: S'il vous plaît ne me conseille pas d'utiliser des trucs JDKs date/heure. Joda-Time est une API bien meilleure. Java 8 présente le package java.time (Tutorial), ce qui est encore mieux.

+2

bonne question ... 'DateTime' pourrait utiliser un' rollForwardTo (...) 'méthode – skaffman

+0

@skaffman Voir mon ROLLFORWARD générique répondre. Ce n'est pas super duper testé mais semble fonctionner pour moi. –

+1

En fait, java.time n'est * pas * forcément meilleur que [Joda-Time] (http://www.joda.org/joda-time/). Chacun a des caractéristiques l'autre manque. Par exemple, java.time n'a pas la classe ['Interval'] (http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html) trouvée dans Joda-Time. Alors utilisez chacun pour ses points forts. Vous pouvez mélanger et faire correspondre dans un projet. Soyez prudent avec vos instructions 'import' car quelques unes de leurs classes partagent le même nom. –

Répondre

39

java.time

Avec le cadre java.time construit en Java 8 et versions ultérieures (Tutorial) vous pouvez utiliser TemporalAdjusters pour obtenir next ou previousday-of-week.

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

Est-ce que cela utilise joda-time? –

+2

Non, mais il en est né. Voici une citation de la page d'accueil de joda time: _Joda-Time est la bibliothèque standard de date et d'heure pour Java avant Java SE 8. Les utilisateurs sont maintenant invités à migrer vers java.time (JSR-310) ._ –

+1

FYI, le Les classes [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) sont intégrées à Java 8 et versions ultérieures. Une grande partie de la fonctionnalité java.time a été reportée sur Java 6 & 7 dans [ThreeTen-Backport] (http://www.threeten.org/threetenbp/) et adaptée à Android dans [ThreeTenABP] (https://github.com/JakeWharton/ThreeTenABP). Consultez également [Oracle Tutorial] (http://docs.oracle.com/javase/tutorial/datetime/TOC.html) pour en savoir plus. –

49

Il est possible de le faire dans un beaucoup plus facile à lire ainsi:

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 un peu la forme 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 encore 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! :)

+2

ou le compiler ... "DateTimeConstans" –

+8

@David Vous n'avez rien vu;) – Esko

+5

+1 pour le sens de l'humour. :) –

5

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

testé un peu ;-)

+1

Merci pour votre réponse. Votre suggestion avec l'approche plus générale est agréable. Mais l'oneliner est gênant en terme de lisibilité. –

+5

@michaelkebe vous avez demandé un oneliner, je viens de fournir un ... ;-) – fvu

+1

@ michael.kebe Je place généralement des nouvelles lignes avec des ternaires à "?" et ":", frappe le format dans Eclipse et s'organise plutôt bien. – gyorgyabraham

4

Je viens de perdre comme 30 minutes à essayer de comprendre cela, mais moi-même J'avais besoin de généraliser.

Quoi qu'il en soit, 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 faire un partiel (qui est LocalDate) pour le jour de la semaine. Maintenant, quel que soit le champ le plus significatif du partiel sera +1 si la date actuelle est après (maintenant). Si vous faites un partiel avec Mars 2012, il créera une nouvelle datetime de mars 2013 ou <.

3

la réponse octets de comptage peut être raccourci encore plus loin:

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

Paramètre 0 pour le dimanche 5 pour vendredi la semaine prochaine

public java.util.Calendar getNextweekOfDay(int weekOfDay) throws Exception{ 
     java.util.Calendar today = java.util.Calendar.getInstance(); 
     int dayOfWeek = today.get(java.util.Calendar.DAY_OF_WEEK); 
     int daysUntilNextWeekOfDay = weekOfDay - dayOfWeek; 
     java.util.Calendar nextWeekOfDay = (java.util.Calendar)today.clone(); 
      nextWeekOfDay.add(java.util.Calendar.DAY_OF_WEEK, daysUntilNextWeekOfDay); 
      nextWeekOfDay.add(java.util.Calendar.DAY_OF_WEEK, 7); 
      nextWeekOfDay.set(java.util.Calendar.HOUR_OF_DAY, 0); 
     return nextWeekOfDay; 
    } 
Questions connexes