Pregunta

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

El 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 revestimiento de línea?

PD: Por favor, no me aconsejen usar cosas de fecha / hora de JDK. Joda-Time es una API mucho mejor.

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

¿Fue útil?

Solución

java.time

Con el marco java.time integrado en Java 8 y posterior ( Tutorial ) puede usar TemporalAdjusters para obtener next o previous día de la semana .

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

Otros consejos

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

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

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

Simplemente perdí como 30 minutos tratando de resolver esto por mí mismo, pero necesitaba avanzar genéricamente.

De todos modos, esta es 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 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 es posterior (ahora).

Es decir, si realiza un parcial con marzo de 2012, creará una nueva fecha y hora de marzo de 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
}

el conteo de bytes @fvu 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);
}

Una solución simple basada en un módulo que debería funcionar con la mayoría de las versiones anteriores de Java en caso de que no se le permita actualizar su versión de Java a Java8 o posterior o utilizar una biblioteca de fechas estándar de Java como Jodatime

El número de días para agregar a su fecha viene dado por esta fórmula:

(7 + Calendar.FRIDAY - yourDateAsCalendar.get (Calendar.DAY_OF_WEEK))% 7

Tenga en cuenta también que esto puede generalizarse para cualquier día de la semana cambiando el campo estático Calendar.FRIDAY a su día de la semana dado. Algún fragmento de código a continuación

public static void main(String[] args) {
    for (int i = 0; i < 15; i++) {

        Calendar cur = Calendar.getInstance();
        cur.add(Calendar.DAY_OF_MONTH, i);

        Calendar friday = Calendar.getInstance();
        friday.setTime(cur.getTime());
        friday.add(Calendar.DAY_OF_MONTH, (7 + Calendar.FRIDAY - cur.get(Calendar.DAY_OF_WEEK)) % 7);

        System.out.println(MessageFormat.format("Date {0} -> {1} ", cur.getTime(),  friday.getTime()));
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top