4
votes

API Java 8 Date - Obtenez le nombre total de semaines dans un mois

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?


5 commentaires

"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?


4 Réponses :


0
votes

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()));


0 commentaires

4
votes

Vous pouvez essayer quelque chose comme cette paire de lignes:

YearMonth currentYearMonth = 
    YearMonth.now( 
        ZoneId.systemDefault() 
    )
;
int weeks = 
    currentYearMonth
    .atEndOfMonth()
    .get(
        WeekFields.ISO.weekOfMonth()
    )
;


3 commentaires

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 .



1
votes

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;
}


0 commentaires

0
votes

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())


0 commentaires