2012-10-04 25 views

Respuesta

8

Por lo que sé, no hay un método incorporado para hacer esto automáticamente en Joda Time. Sin embargo, podría escribir su propio método, que incremente la fecha en un bucle hasta que llegue a un día laborable.

Tenga en cuenta que, dependiendo de lo que necesite exactamente, esto podría ser (mucho) más complicado de lo que cree. Por ejemplo, ¿debería omitir las vacaciones también? Qué días son días festivos depende del país en el que se encuentre. Además, en algunos países (por ejemplo, los países árabes), el fin de semana es el jueves y el viernes, no el sábado ni el domingo.

+0

Entiendo que las vacaciones podrían omitirse pero esto no es un problema. ¿Cómo verifica un weekeday por cierto? Estoy utilizando objetos YearMonthDay – Bober02

+0

En primer lugar, tenga en cuenta que 'YearMonthDay' está en desuso, debe utilizar' LocalDate' en su lugar. Puede pasar su 'YearMonthDay' al constructor de' LocalDate'. Esa clase tiene un método 'getDayOfWeek()' que devuelve el día de la semana (0 = domingo, 1 = lunes, ..., 6 = sábado). – Jesper

+2

De acuerdo con la especificación JodaTime 1 es el lunes y el 7 es el domingo. ¿Estás seguro de que 0 funciona también para el domingo? fuente: http://joda-time.sourceforge.net/apidocs/org/joda/time/Chronology.html#dayOfWeek() – user1581900

-4

Clase YearMonthDay está en desuso y no debe usarlo. Si cambia a una simple DateTime puede obtener el día de la semana, llamando:

dateTime.getDayOfWeek(); 

Para el viernes Será 5.

Uno de los enfoques pueden estar haciendo un método AddDays personalizados que debe parecerse a lo :

addDays(DateTime dateTime, int days) { 
    for(int i=0;i<days;i++){ 
     dateTime.plusDays(1); 
     if(dateTime.getDayOfWeek()==6) dateTime.plusDays(2); // if Saturday add 2 more days } 
} 
+0

Su ejemplo está incompleto, ¿qué pasa si es sábado? Además, 'LocalDate' es un reemplazo más preciso para' YearMonthDay' que 'DateTime'. – Jesper

+0

Nunca supe que estoy obligado a dar soluciones COMPLETAS a los problemas. Supuse que el OP funciona solo con días hábiles, por lo que es poco probable, que pase el sábado o el domingo. También asumí que es lo suficientemente inteligente como para resolver el resto por su cuenta ... Por otro lado, nunca he tratado con JodaTime antes y al igual que usted busqué en Google la respuesta ... – user1581900

+4

Tenga en cuenta que este enfoque trata de mutar el ' el objeto dateTime', que no es posible porque los objetos 'DateTime' son inmutables. Deberá crear una nueva instancia para cada iteración y devolver la última, es decir, 'dateTime = dateTime.plusDays (1); ... return dateTime; '. – benjamin

4
LocalDate newDate = new LocalDate(); 
int i=0; 
while(i<days)//days == as many days as u want too 
{ 
    newDate = newDate.plusDays(1);//here even sat and sun are added 
    //but at the end it goes to the correct week day. 
    //because i is only increased if it is week day 
    if(newDate.getDayOfWeek()<=5) 
    { 
     i++; 
    } 

} 
System.out.println("new date"+newDate); 
+0

Gracias. Esto ayudó mucho. –

1

Tenga en cuenta que iteración a través de la adición de N días uno a la vez puede ser relativamente caro. Para valores pequeños de N y/o código no sensible al rendimiento, esto probablemente no sea un problema. Donde sea, recomendaría minimizar las operaciones de agregar calculando cuántas semanas y días necesita ajustar por:

/** 
* Returns the date that is {@code n} weekdays after the specified date. 
* <p> 
* Weekdays are Monday through Friday. 
* <p> 
* If {@code date} is a weekend, 1 weekday after is Monday. 
*/ 
public static LocalDate weekdaysAfter(int n, LocalDate date) { 
    if (n == 0) 
     return date; 
    if (n < 0) 
     return weekdaysBefore(-n, date); 
    LocalDate newDate = date; 
    int dow = date.getDayOfWeek(); 
    if (dow >= DateTimeConstants.SATURDAY) { 
     newDate = date.plusDays(8 - dow); 
     n--; 
    } 
    int nWeeks = n/5; 
    int nDays = n % 5; 
    newDate = newDate.plusWeeks(nWeeks); 
    return ((newDate.getDayOfWeek() + nDays) > DateTimeConstants.FRIDAY) 
      ? newDate.plusDays(nDays + 2) 
      : newDate.plusDays(nDays); 
Cuestiones relacionadas