Je travaille sur un projet. Là, je devrais trouver le total des semaines d'une année. J'ai essayé avec le code suivant, mais je reçois la mauvaise réponse: 2020 a 53 semaines, mais ce code donne 52 semaines.
Où me suis-je trompé dans ce code?
package com.hib.mapping;
import java.time.LocalDate;
import java.time.temporal.WeekFields;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.joda.time.DateTime;
public class TestWeek {
public static void main(String args[]) {
System.out.println(getWeeks());
}
public static int getWeeks() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2020);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
GregorianCalendar gregorianCalendar = new GregorianCalendar();
int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (gregorianCalendar.isLeapYear(2020)) {
if (weekDay == Calendar.THURSDAY || weekDay == Calendar.WEDNESDAY)
return 53;
else
return 52;
} else {
if (weekDay == Calendar.THURSDAY)
return 53;
else
return 52;
}
}
}
Production:
52
java
date
java-8
week-number
Kumaresan Perumal
la source
la source
Date
etCalendar
. Utilisez à lajava.time
place, c'est beaucoup mieux et plus simple.Réponses:
Utilisation de la définition Wikipedia ici . Une année compte 53 semaines si le 1er janvier est un jeudi ou le 31 décembre est un jeudi, sinon elle compte 52 semaines. Cette définition est équivalente à celle que vous avez utilisée. Je pense que c'est une condition beaucoup plus facile à vérifier, car vous n'avez pas besoin de vérifier les années bissextiles.
Utilisation des
java.time
API Java 8 :la source
tl; dr
Pour une semaine ISO 8601 standard, utilisez la
YearWeek
classe de la bibliothèque ThreeTen-Extra avec une déclaration ternaire.C'est,
YearWeek.of( 2020 , 1 ).is53WeekYear() ? 53 : 52
Définir la «semaine»
Vous devez définir une semaine. Dans votre exemple de code, la définition de week varie selon la valeur par défaut actuelle de la JVM
Locale
. Vos résultats peuvent donc varier lors de l'exécution.Votre code utilise également de terribles classes de date-heure qui ont été remplacées il y a des années par les classes modernes de java.time . Arrêtez d'utiliser
GregorianCalendar
&Calendar
; ils ont été remplacés pour de bonnes raisons.ISO 8601 semaine
L' ISO 8601 norme définit une semaine comme:
Cette définition signifie:
Si votre définition diffère, consultez la réponse d'Ole VV .
YearWeek:is53WeekYear
Si cela correspond à votre définition, ajoutez la bibliothèque ThreeTen-Extra à votre projet pour étendre la fonctionnalité java.time intégrée à Java 8 et versions ultérieures. Vous avez alors accès à la
YearWeek
classe.Pour vous renseigner sur une année en particulier, choisissez simplement n'importe quelle semaine de l'année. Par exemple, pour l'année 2020 basée sur la semaine, nous demandons la semaine # 1.
Remarquez comment le premier jour de l'année hebdomadaire 2020 est à partir de l'année civile 2019.
la source
now
. Étant donné que vous souhaitez obtenir le nombre de semaines pour une année spécifique, au lieu de l'année en cours, utilisez simplementYearWeek.of(yourYear, 1)
.Asia/Kolkata
, actuellement avec un décalage de +05: 30. Dans le code Java:ZoneId.of( "Asia/Kolkata" )
. Pour plus d'informations et d'histoire, voir Wikipedia, Time in India .La solution flexible
Cela devrait fonctionner pour tout schéma de numérotation de semaine qui peut être représenté dans un
WeekFields
objet.L'idée est de trouver le numéro de semaine de la dernière semaine de l'année basée sur la semaine. J'essaie d'abord avec le 31 décembre, mais cela peut être dans la première semaine de l'année suivante. Si c'est le cas, je retourne une semaine en arrière.
J'ai testé assez soigneusement avec
WeekFields.ISO
, pas tellement avec d'autresWeekFields
objets, mais comme je l'ai dit, je crois que cela fonctionne.Si vous savez pertinemment que vous aurez toujours besoin d' ISO 8601 semaines, je pense que vous devriez choisir l'une des bonnes réponses de Sweeper et de Basil Bourque . J'ai posté cela au cas où vous auriez besoin d'une solution plus flexible qui fonctionnerait également avec d'autres schémas de numérotation des semaines.
Utilisez java.time
Le code dans votre question est drôle en ce qu'il importe des classes à la fois de Joda-Time et de java.time, tout en utilisant l'ancien
Calendar
etGregorianCalendar
de Java 1.1. Ces classes étaient mal conçues et sont maintenant dépassées depuis longtemps, vous ne devriez pas les utiliser. Joda-Time est en mode maintenance, java.time a pris le relais. C'est ce que j'utilise et vous recommande d'utiliser.la source
Je pense que cela devrait aussi bien fonctionner:
la source
Après avoir essayé beaucoup en java 8. Je n'ai pas pu trouver de solution. puis j'ai préparé la dépendance de date et d'heure de Joda. Cela m'a donné une bonne réponse comme je m'y attendais
code:
Dépendance Maven:
la source