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