una semana que pida obtener número numero nombre mes fecha día diga correspondiente java android date calendar

java - que - Obtenga semanas del mes según el inicio de la semana



obtener nombre mes java (3)

Estoy usando un calendario personalizado en mi aplicación. He dado a los usuarios la opción de seleccionar el primer día de la semana que podría ser: Saturday, Sunday, Monday

Quiero obtener el número de semanas en un mes, dependiendo de cuándo comienza la semana, anulando el valor predeterminado de inicio de semana, Sunday .

Código:

public int getWeeksOfMonth(int year, int month) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MONTH, month-1); calendar.set(Calendar.YEAR, year); int numOfWeeksInMonth = calendar.getActualMaximum(Calendar.WEEK_OF_MONTH); return numOfWeeksInMonth; }



Tratar

calendar.setFirstDayOfWeek(Calendar.MONDAY); //sets first day to monday, for example.

En su caso, es posible que desee hacer esto:

public int getWeeksOfMonth(int year, int month, int weekStart) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MONTH, month-1); calendar.set(Calendar.YEAR, year); calendar.setFirstDayOfWeek(weekStart); int numOfWeeksInMonth = calendar.getActualMaximum(Calendar.WEEK_OF_MONTH); return numOfWeeksInMonth; }

Y llama al método con una línea como

int weeks = getWeeksOfMonth(2012, 5, Calendar.WEDNESDAY);


tl; dr

ChronoUnit.WEEKS.between( calendarStart , calendarStop )

Evitar clases heredadas

Evite las viejas clases problemáticas de fecha y hora que ahora son heredadas, suplantadas por las clases modernas de java.time.

java.time

Rastree el día de la semana usando la enum de DayOfWeek .

DayOfWeek firstDayOfWeek = DayOfWeek.MONDAY ;

Obtenga el mes en el que está interesado, representado por un YearMonth . Quizás el mes actual. Para el mes actual, debe especificar la zona horaria deseada / esperada, ya que en cualquier momento dado la fecha puede variar alrededor del mundo por zona.

ZoneId z = ZoneId.of( "America/Montreal" ) ; YearMonth ym = YearMonth.now( z ) ;

Obtenga el primer y último día del mes.

LocalDate monthStart = ym.atDay( 1 ) ; LocalDate monthStop = ym.atEndOfMonth() ;

Obtener la fecha para el día de la semana. Para eso, use un TemporalAdjuster , uno proporcionado por la clase TemporalAdjusters (observe el plural s ).

Los intervalos de tiempo en java.time se definen sabiamente utilizando el enfoque de Medio Abierto, donde el comienzo es inclusivo, mientras que el final es exclusivo . Así que tenga en cuenta cómo necesitamos obtener la fecha del día de la semana deseado después del final del mes. Si el fin de mes pasó a ser el día de la semana deseado, tenemos que pasarlo.

LocalDate calendarStart = monthStart.with( TemporalAdjusters.previousOrSame( firstDayOfWeek ) ) ; LocalDate calendarStop = monthStop.with( TemporalAdjusters.next( firstDayOfWeek ) ) ;

Calcule el número de semanas entre.

long weeks = ChronoUnit.WEEKS.between( calendarStart , calendarStop ) ;

Vea este código ejecutado en vivo en IdeOne.com .

firstDayOfWeek: LUNES

ym: 2017-09

mes: 2017-09-01 / 2017-09-30

calendario: 2017-08-28 / 2017-10-02

semanas: 5

Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas de fecha y hora, como java.util.Date , Calendar y SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busque para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

¿Dónde obtener las clases de java.time?

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y más .