Tempo: come ottenere il venerdì successivo?

Come posso ottenere il venerdì successivo con l’API Joda-Time .

Il LocalDate di oggi è today . Mi sembra che tu debba decidere se sei prima o dopo il venerdì della settimana corrente. Vedi questo metodo:

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

È ansible farlo più corto o con un oneliner?

PS: per favore non mi consiglia di usare la data / ora di JDKs. Joda-Time è un’API molto migliore.

Java 8 introduce il pacchetto java.time ( Tutorial ) che è ancora meglio.

È ansible farlo in un modo molto più semplice da leggere:

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

o in forma un po 'più breve

 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 } 

o anche più breve

 private LocalDate calcNextFriday(LocalDate d) { if (d.getDayOfWeek() >= DateTimeConstants.FRIDAY) { d = d.plusWeeks(1); } return d.withDayOfWeek(DateTimeConstants.FRIDAY); } 

PS. Non ho provato il codice reale! 🙂

java.time

Con il framework java.time integrato in Java 8 e versioni successive ( Tutorial ) è ansible utilizzare TemporalAdjusters per ottenere il giorno della settimana successivo o precedente .

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

Il tuo codice in 1 riga

 private LocalDate calcNextFriday3(LocalDate d) { return d.isBefore(d.dayOfWeek().setCopy(5))?d.dayOfWeek().setCopy(5):d.plusWeeks(1).dayOfWeek().setCopy(5); } 

Approccio alternativo

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

in qualche modo testato 😉

Ho solo sprecato come 30 minuti cercando di capirlo da solo, ma ho dovuto genericamente rotolare in avanti.

Comunque qui è la mia soluzione:

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

Ora devi solo creare un partial (che è LocalDate) per il giorno della settimana.

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

Ora qualunque sia il campo più significativo del partial sarà +1 se la data corrente è successiva (ora).

Cioè se si effettua una parziale con marzo 2012 verrà creato un nuovo datetime di marzo 2013 o <.

 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 } 

contando i byte la risposta @fvu può essere abbreviata ulteriormente:

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