55 votos

Joda-Time: Cómo conseguir el próximo viernes?

¿Cómo puedo obtener el próximo viernes con la Joda de la API de Tiempo.

El LocalDate de hoy es today. Me parece que usted tiene que decidir whever se encuentran antes o después de que el viernes de la semana actual. Ver 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 hacer que sea más corto o con un oneliner?

PS: por Favor, no me aconseja el uso de JDKs fecha/hora de material. Joda-el Tiempo es mucho mejor a la API.

52voto

Esko Puntos 15578

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 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. Yo no prueba el código real! :)

5voto

fvu Puntos 21471

Su código en la línea 1

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

4voto

Adam Gent Puntos 15055

He desperdiciado como 30 minutos tratando de entender esto a mí, pero yo necesitaba de forma genérica rollo hacia adelante.

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 sólo tiene que hacer un Parcial de (que LocalDate es) para el día de la semana.

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

Ahora, cualquiera que sea el campo más significativo es el de los parciales será de +1 si la fecha actual es después (ahora).

Es que si se hacen con un parcial de Marzo de 2012 se va a crear un nuevo datetime de Marzo de 2013 o <.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X