online library joda examples example dates create java date datetime time jodatime

java - library - jodatime difference between dates



Tiempo: ¿Cómo llegar el próximo viernes? (6)

java.time

Con el marco java.time integrado en Java 8 y posterior ( Tutorial ) puede usar TemporalAdjusters para obtener el day-of-week next o previous .

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

¿Cómo puedo obtener el próximo viernes con la API de Joda-Time ?

El día LocalDate de hoy es today . Me parece que debes decidir dónde estás antes o después del viernes de la semana actual. Vea este método:

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

¿Es posible hacerlo más corto o con un oneliner?

PD: Por favor, no me aconsejen que use el material de fecha y hora de JDK. Joda-Time es una API mucho mejor.

Java 8 introduce el paquete java.time ( Tutorial ) que es aún mejor.


Es posible hacerlo de una manera mucho más fácil de leer:

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 en una forma un poco más corta

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 incluso más corto

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

PD. ¡No probé el código real! :)


Solo desperdicié como 30 minutos tratando de resolver esto por mi cuenta, pero necesitaba avanzar genéricamente.

De todos modos aquí está mi solución:

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

Ahora solo necesita hacer un Parcial (que es el LocalDate) para el día de la semana.

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

Ahora cualquiera que sea el campo más significativo del parcial será +1 si la fecha actual está después de él (ahora).

Es decir, si realiza un parcial con marzo de 2012 creará un nuevo datetime de marzo de 2013 o <.


Tu código en 1 línea

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

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

algo probado ;-)


contar bytes @fvu la respuesta se puede acortar aún más a:

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


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 }