2012-02-16 35 views
19

Tenemos una utilidad que se ejecutará cualquier día entre lunes y viernes. Actualizará una cierta cantidad de archivos dentro de una herramienta de gestión de contenido. La última fecha de modificación asociada con ese archivo debe ser la fecha del lunes de esa semana. Escribí el siguiente programa para recuperar la fecha del lunes de la semana actual. Pero todavía no estoy seguro de si esto funcionaría para todos los escenarios. ¿Alguien tiene una mejor solución?Recuperar la fecha del lunes de la semana actual

Calendar c = Calendar.getInstance(); 
c.setTime(new Date()); 
System.out.println(c.get(Calendar.DAY_OF_MONTH)); 
System.out.println(c.get(Calendar.DAY_OF_WEEK)); 
int mondayNo = c.get(Calendar.DAY_OF_MONTH)-c.get(Calendar.DAY_OF_WEEK)+2; 
c.set(Calendar.DAY_OF_MONTH,mondayNo); 
System.out.println("Date "+c.getTime()); 
+0

Para su información, está usando clases problemáticas antiguas de fecha y hora que ahora son heredadas, suplantadas por las clases java.time. –

Respuesta

43

recomendaría encarecidamente el uso de Joda Time lugar (por todo su trabajo de fecha/hora, no sólo este):

// TODO: Consider time zones, calendars etc 
LocalDate now = new LocalDate(); 
LocalDate monday = now.withDayOfWeek(DateTimeConstants.MONDAY); 
System.out.println(monday); 

Tenga en cuenta que a medida que ha utilizado Lunes aquí, que es el primer día de la semana en Joda Time, esto siempre devolverá un día antes (o el mismo día). Si eligió el miércoles (por ejemplo), entonces avance hasta el miércoles de lunes a martes. Siempre puede agregar o restar una semana si necesita "el próximo miércoles" o "el miércoles anterior".

EDIT: Si realmente desea utilizar java.util.Date/Calendar, puede utilizar:

Calendar c = Calendar.getInstance(); 
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
System.out.println("Date " + c.getTime()); 

Usted puede utilizar Calendar.setFirstDayOfWeek para indicar si una semana es de lunes a domingo o de domingo a sábado ; I cree estableciendo que el día de la semana permanecerá dentro de la semana actual, pero pruébelo.

+1

¿No es esto? posible con solo API de Java? Usamos una herramienta CMS, donde agregar un nuevo jar requeriría un cambio de implementación. –

+1

@ShashankKadne: Es * posible *, claro, pero es * horrible *. Si realiza una cantidad significativa de trabajo basado en la fecha, los beneficios de usar Joda Time superarán * * ampliamente el breve costo. –

+0

@ShashankKadne: he editado mi respuesta con el código java.util.Calendar ... pero aún así recomiendo usar Joda Time. –

1

Qué acerca del uso Joda Time biblioteca ... Tome miro este answer ...

+0

¿Esto no es posible solo con api de Java? Usamos una herramienta CMS, donde agregar un nuevo jar requeriría un cambio de implementación. –

+0

Trate de mirar Joda Time [fuente] (https://github.com/JodaOrg/joda-time) .. Tal vez podría encontrar la mejor manera de implementar una función de este tipo con Java api ... – PrimosK

-1

No funcionará si la semana Lunes corrientes es el mes antes ... Por ejemplo, si hoy es viernes, 1 de junio de ... Probablemente debería más bien utilizar el método roll ...

+1

Me dio el lunes 28 de mayo a las 14:51:27 GMT + 05: 30 2012 ... y creo que es correcto. –

+0

Mi error, tienes razón, funciona ... – pgras

6

La siguiente trabajará, incluyendo los meses de embalaje:

Calendar c = Calendar.getInstance(); 
c.setFirstDayOfWeek(Calendar.MONDAY); 
c.setTime(new Date()); 
int today = c.get(Calendar.DAY_OF_WEEK); 
c.add(Calendar.DAY_OF_WEEK, -today+Calendar.MONDAY); 
System.out.println("Date "+c.getTime()); 

Sin embargo, si edita su aplicación en un domingo (. ej domingo 12 de febrero), la fecha será para el lunes siguiente. Según sus requisitos (la aplicación solo se ejecutará de lunes a viernes), esto no debería representar un problema.

+0

(+1) para hacerlo funcionar para esa condición extrema. Pero me iré con la solución de @ Jon, ya que su código es más pequeño que el mío. ;) –

2

Como sugiere Jon, el método funciona calendar.set ... Lo he probado tanto en el caso de un lunes en el mismo mes y otro mes en el uso siguiente fragmento:

Calendar c = Calendar.getInstance(); 
//ensure the method works within current month 
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
System.out.println("Date " + c.getTime()); 
//go to the 1st week of february, in which monday was in january 
c.set(Calendar.DAY_OF_MONTH, 1); 
System.out.println("Date " + c.getTime()); 
//test that setting day_of_week to monday gives a date in january 
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
System.out.println("Date " + c.getTime()); 
//same for tuesday 
c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY); 
System.out.println("Date " + c.getTime()); 

Los resultados :

Date Mon Feb 13 10:29:41 CET 2012 
Date Wed Feb 01 10:29:41 CET 2012 
Date Mon Jan 30 10:29:41 CET 2012 
Date Tue Jan 31 10:29:41 CET 2012 
0

en caso de que no desee utilizar Joda Time se puede hacer como esto para encontrar las semanas -> (funciona en Android)

public static ArrayList<String> getWeeks(int month) { 

ArrayList<String> arrayListValues = new ArrayList<>(); 
SimpleDateFormat sdf = new SimpleDateFormat("MMMM d"); 

Calendar calendar = Calendar.getInstance(); 

calendar.set(Calendar.MONTH, month); 

int day = calendar.get(Calendar.DAY_OF_WEEK); 
while (day != 1) { 
    calendar.add(Calendar.DATE, 1); 
    day = calendar.get(Calendar.DAY_OF_WEEK); 
} 

calendar.add(Calendar.DATE, -14); 
String y1 = sdf.format(calendar.getTime()); 
calendar.add(Calendar.DATE, 6); 
String y2 = sdf.format(calendar.getTime()); 
calendar.add(Calendar.DATE, 1); 
arrayListValues.add(y1 + " - " + y2); 

y1 = sdf.format(calendar.getTime()); 
calendar.add(Calendar.DATE, 6); 
y2 = sdf.format(calendar.getTime()); 
calendar.add(Calendar.DATE, 1); 
arrayListValues.add(y1 + " - " + y2); 



for (int i = 0; i < 10; i++) { 

    y1 = sdf.format(calendar.getTime()); 
    calendar.add(Calendar.DATE, 6); 
    y2 = sdf.format(calendar.getTime()); 
    calendar.add(Calendar.DATE, 1); 
    arrayListValues.add(y1 + " - " + y2); 
} 

return arrayListValues; 
} 
9

tl; dr

LocalDate previousMonday = 
    LocalDate.now(ZoneId.of("America/Montreal")) 
      .with(TemporalAdjusters.previous(DayOfWeek.MONDAY)); 

java.time

Tanto la clase y la biblioteca java.util.Calendar Joda-Time ha sido suplantada por el marco java.time incorporado en Java 8 y versiones posteriores. Ver Oracle Tutorial. Gran parte de la java.la funcionalidad de tiempo ha sido retransportada a Java 6 & 7 en ThreeTen-Backport y adaptada a Android en ThreeTenABP.

La clase java.time.LocalDate representa un valor de fecha solamente sin hora del día y sin zona horaria.

La determinación de la fecha de hoy requiere un huso horario, un ZoneId.

ZoneId zoneId = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(zoneId); 

El TemporalAdjuster interfaz (ver Tutorial) es una forma sencilla pero poderosa para manipular los valores de fecha y hora. La clase TemporalAdjusters (observe el plural) implementa algunos ajustes muy útiles. Aquí usamos previous(DayOfWeek).

La práctica DayOfWeek enum hace que sea fácil especificar un día de la semana.

LocalDate previousMonday = today.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)); 

Si hoy es lunes, y que desea utilizar hoy hace más de una semana, llame previousOrSame.

+0

La mejor respuesta cuando Java 8 está disponible. – peceps

+1

@peceps Vuelve a leer el primer párrafo. Disponible como un puerto de respaldo para Java 6, Java 7 y Android. Entonces java.time es el mejor enfoque donde se usa Java. –

Cuestiones relacionadas