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;
}
Intenta establecer el primer día de la semana primero:
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?
- Java SE 8 , Java SE 9 y posterior
- Incorporado.
- Parte de la API Java estándar con una implementación integrada.
- Java 9 agrega algunas características y correcciones menores.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
- Androide
- El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) específicamente para Android.
- Consulte Cómo utilizar ThreeTenABP ....
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 .