2009-10-28 13 views
45

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

El LocalDate de hoy en día es today. Me parece que debes decidir dónde estás antes o después del viernes de la semana actual. Consulte 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 aconseja el uso de JDK fecha de material/hora. Joda-Time es una API mucho mejor.

Java 8 introduce java.time paquete (Tutorial) que es incluso mejor.

+2

buena pregunta ... 'DateTime' podría utilizar un' rollForwardTo (...) 'método – skaffman

+0

@skaffman Ver mi ROLLFORWARD genérica responder. No es super probado pero parece funcionar para mí. –

+1

En realidad, java.time * no * es necesariamente mejor que [Joda-Time] (http://www.joda.org/joda-time/). Cada uno tiene características que el otro no tiene. Por ejemplo, java.time no tiene la clase ['Interval'] (http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html) que se encuentra en Joda-Time. Entonces use cada uno de sus puntos fuertes. Puede mezclar y combinar dentro de un proyecto. Solo tenga cuidado con sus declaraciones 'import' ya que algunas de sus clases comparten el mismo nombre. –

Respuesta

39

java.time

Con el marco java.time incorporado en Java 8 y versiones posteriores (Tutorial) se puede utilizar para obtener TemporalAdjustersnext o previousday-of-week.

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

¿Esto usa joda-time? –

+2

No, pero se desarrolló a partir de él. Aquí una cita de la página de inicio de joda time: _Joda-Time es la biblioteca de fecha y hora estándar de facto para Java anterior a Java SE 8. Ahora se solicita a los usuarios migrar a java.time (JSR-310) ._ –

+1

FYI, el [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) las clases están integradas en Java 8 y versiones posteriores. Gran parte de la funcionalidad de java.time ha sido retransmitida a Java 6 y 7 en [ThreeTen-Backport] (http://www.threeten.org/threetenbp/) y adaptada a Android en [ThreeTenABP] (https://github.com/JakeWharton/ThreeTenABP). Además, consulte [Oracle Tutorial] (http://docs.oracle.com/javase/tutorial/datetime/TOC.html) para obtener más información. –

49

Es posible hacerlo de una forma mucho más fácil de leer así:

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 un bit de forma 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! :)

+2

o compilarlo ... "DateTimeConstans" –

+8

@David No vio nada;) – Esko

+5

+1 por sentido del humor. :) –

5

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

+1

Gracias por su respuesta. Su sugerencia con el enfoque más general es agradable. Pero el oneliner es incómodo en términos de legibilidad. –

+5

@michaelkebe solicitaste un oneliner, acabo de proporcionar uno ... ;-) – fvu

+1

@ michael.kebe Suelo colocar nuevas líneas con ternaries en "?" y ":", pulse el formato en Eclipse y arregla bastante bien. – gyorgyabraham

4

Me acabo de perder como 30 minutos tratando de resolver esto yo solo, pero Necesitaba avanzar genéricamente 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 (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 está después de él (ahora).

Eso es si haces un parcial a marzo de 2012 se cree una nueva fecha y hora del mes de marzo de 2013 o <.

3

bytes contando @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); 
} 
2

parámetro 0 para el domingo 5 para el viernes de la próxima semana

public java.util.Calendar getNextweekOfDay(int weekOfDay) throws Exception{ 
     java.util.Calendar today = java.util.Calendar.getInstance(); 
     int dayOfWeek = today.get(java.util.Calendar.DAY_OF_WEEK); 
     int daysUntilNextWeekOfDay = weekOfDay - dayOfWeek; 
     java.util.Calendar nextWeekOfDay = (java.util.Calendar)today.clone(); 
      nextWeekOfDay.add(java.util.Calendar.DAY_OF_WEEK, daysUntilNextWeekOfDay); 
      nextWeekOfDay.add(java.util.Calendar.DAY_OF_WEEK, 7); 
      nextWeekOfDay.set(java.util.Calendar.HOUR_OF_DAY, 0); 
     return nextWeekOfDay; 
    } 
Cuestiones relacionadas