Tengo una función de Kotlin para obtener el número total de semanas en un mes.
Código
fun getTotalWeeksInMonth(instant: Instant): Int { val calendar = Calendar.getInstance() calendar.time = Date.from(instant) return calendar.getActualMaximum(Calendar.WEEK_OF_MONTH) } Sin embargo, esto está utilizando una combinación de las antiguas API de fecha/hora de Java ( Date y Calendar ) y las nuevas API ( Instant )
¿Cómo lograría el mismo resultado usando solo las nuevas API?
Puedes probar algo como este par de líneas:
YearMonth currentYearMonth = YearMonth.now( ZoneId.systemDefault() ) ; int weeks = currentYearMonth .atEndOfMonth() .get( WeekFields.ISO.weekOfMonth() ) ;Puede evaluar la "semana del mes" del último día de este mes, en java:
static int getTotalWeeksInMonth(Instant instant) { LocalDate localDate = LocalDate.ofInstant(instant, ZoneId.systemDefault()); LocalDate lastDayOfMonth = localDate.withDayOfMonth(localDate.lengthOfMonth()); int lastWeekOfMonth = lastDayOfMonth.get(WeekFields.ISO.weekOfMonth()); return lastWeekOfMonth; }Vea si esto le conviene, tenga cuidado con la Zone por la que realmente está pasando y con WeekFields.ISO , en algunas regiones puede funcionar bien, pero en otras puede que no:
Instant now = Instant.now(); ZonedDateTime zonedNow = now.atZone(ZoneId.systemDefault()); ZonedDateTime monthEnd = zonedNow.with(TemporalAdjusters.lastDayOfMonth()); System.out.println(monthEnd.get(WeekFields.ISO.weekOfMonth()));