J'ai une fonction Kotlin pour obtenir le nombre total de semaines dans un mois
Code
fun getTotalWeeksInMonth(instant: Instant): Int { val calendar = Calendar.getInstance() calendar.time = Date.from(instant) return calendar.getActualMaximum(Calendar.WEEK_OF_MONTH) }
Cependant, cela utilise un mix des anciennes API de date / heure Java ( Date
et Calendar
) et des nouvelles API ( Instant
)
Comment J'obtiens le même résultat, en utilisant uniquement les nouvelles API?
4 Réponses :
Voyez si cela vous convient, faites attention à la Zone
que vous passez réellement et à WeekFields.ISO
, dans certaines régions, cela peut fonctionner correctement, mais dans d'autres il ne peut pas:
Instant now = Instant.now(); ZonedDateTime zonedNow = now.atZone(ZoneId.systemDefault()); ZonedDateTime monthEnd = zonedNow.with(TemporalAdjusters.lastDayOfMonth()); System.out.println(monthEnd.get(WeekFields.ISO.weekOfMonth()));
Vous pouvez essayer quelque chose comme cette paire de lignes:
YearMonth currentYearMonth = YearMonth.now( ZoneId.systemDefault() ) ; int weeks = currentYearMonth .atEndOfMonth() .get( WeekFields.ISO.weekOfMonth() ) ;
Pas besoin d'utiliser des getters pour l'année et le mois, vous pouvez simplement faire YearMonth.from (date)
De plus, weekOfMonth
est livré avec un grand nombre de mises en garde.
@Michael J'ai édité le code. En fait, aucun des codes LocalDate
n'était nécessaire. Nous pouvons capturer le YearMonth
actuel avec YearMonth.now
.
Vous pouvez évaluer la "semaine du mois" du dernier jour de ce mois, 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; }
Ayant un Instant
, je le convertirais d'abord en date:
fun getTotalWeeksInMonth(instant: Instant): Int { val date = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()) return YearMonth.from(date).atEndOfMonth().get(ChronoField.ALIGNED_WEEK_OF_MONTH) }
Ensuite, utilisez soit
YearMonth.from(date).atEndOfMonth().get(WeekFields.ISO.weekOfMonth())
ou
YearMonth.from(date).atEndOfMonth().get(ChronoField.ALIGNED_WEEK_OF_MONTH)
Exemple complet:
val date = LocalDateTime.ofInstant(instant, ZoneId.systemDefault())
"défini comme tel" ... vous n'avez rien défini. Qu'est-ce que tu veux? Quel est «le nombre total de semaines dans un mois»?
@Michael Par exemple, janvier 2019 s'étend sur 5 semaines, mais je ne veux pas le découvrir en utilisant des API obsolètes
@deHaar C'est exactement ce que pose la question.
@ series0ne Eh bien, que définissez-vous comme une semaine? Le Royaume-Uni utilise le lundi comme début de semaine, les États-Unis le dimanche.
@Michael alors disons que vous vouliez trouver le dernier dimanche de janvier 2019. Ce serait le 27. Mais disons que vous vouliez trouver le 5ème dimanche de janvier 2019. Cette date n'existe pas car il n'y a que 4 dimanches en janvier 2019. Cependant, il n'en va pas de même pour mars 2019, car il y a cinq dimanches, donc je besoin d'une fonction qui détermine le nombre de semaines dans le mois? - À moins que vous ne trouviez une meilleure façon de faire cela?