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
}