IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Obtenir la semaine et l'année d'une date


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut Obtenir la semaine et l'année d'une date
    Bonjour à tous,

    Je souhaiterai obtenir le numéro de la semaine et l'année par rapport à une date donnée en paramètre. Voici le code que j'ai utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       public static void getNumWeekYearOfDate(Date dateInc) {
            Calendar cal = Calendar.getInstance(Locale.FRANCE);
            cal.setTime(dateInc);
     
            System.out.println("n° semaine : " + cal.get(Calendar.WEEK_OF_YEAR));
            System.out.println("Année  : " + cal.get(Calendar.YEAR));
       }
    Ce code marche très bien à quelques exception près. En effet, il peut arriver que début janvier l'on soit sur une semaine de l'année précédente ou quand fin décembre l'on soit sur une semaine de l'année suivante.
    Par exemple le 1er janvier 2012 équivaut à la semaine 52 de l'année 2011.

    Quelqu'un aurait-il une idée pour que ma fonction renvoies le numéro de la semaine et la bonne année de ma date passée en paramètre?

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2004
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2004
    Messages : 265
    Points : 342
    Points
    342
    Par défaut
    Salut,
    Je crois que c'est normal, ça correspond au format ISO :
    http://fr.wikipedia.org/wiki/Num%C3%...O_des_semaines.

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    C'est normal : le 1er janvier 2012 est un dimanche. C'est donc le dernier jour de la dernière semaine de 2011...

    Tu voudrais avoir quoi dans ce cas ???

    a++

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    En fait je voudrais qu'il me renvoi par rapport au 1er janvier 2012 la semaine 52 de l'année 2011.

    J'ai fais quelques recherche de mon coté, effectivement si le 1er janvier de l'année N est un vendredi, samedi ou dimanche, cette semaine appartiendra a la semaine de l'année N-1 car elle n'aura que 3 jours sur 7 sur l'année N.

    De même pour le 31 décembre de l'année N, si c'est un Lundi, Mardi ou Mercredi, la semaine appartiendra à la semaine de l'année [N+1] car elle n'aura que 3 jours sur 7 sur l'année N.

    De la je devrais pouvoir créer un petit algorithme pour récupérer l'année correspondant à la semaine, mais peut être existe t-il une fonction dans Calendar pour récupérer la bonne année correspondant à la semaine renvoyée.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par RomG7 Voir le message
    De la je devrais pouvoir créer un petit algorithme pour récupérer l'année correspondant à la semaine, mais peut être existe t-il une fonction dans Calendar pour récupérer la bonne année correspondant à la semaine renvoyée.
    Pas que je sache, j'ai déjà cherché en ce sens.

    Ce que je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    int weekNum = cal.get(Calendar.WEEK_OF_YEAR);
    // Régler le calendrier en début de semaine
    cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
    // Lire l'année en début de semaine
    int weekStartYear = cal.get(Calendar.YEAR);
    // Régler en fin de semaine
    cal.add(Calendar.DAY_OF_YEAR, 6);
    // Lire l'année en fin de semaine
    int weekEndYear = cal.get(Calendar.YEAR);
     
    // Comparer weekStartYear et weekEndYear =>
    // Si c'est les mêmes, on a pas changé d'année.
    // Sinon, et que weekNum est 1, notre date est dans la nouvelle année
    // Sinon, notre date est dans l'ancienne année.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Je m'étais amusé à faire un petit algorithme. Je suis parti du principe que si la date est supérieure au 3 janvier et inférieure au 29 décembre, on est sur que l'on est sur une semaine de l'année N.

    Merci pour ta réponse. Ta méthode à l'air parfaite, je vais la tester.

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par RomG7 Voir le message
    Je m'étais amusé à faire un petit algorithme qui à l'air de fonctionner. Je suis parti du principe que si la date est supérieure au 3 janvier et inférieure au 29 décembre, on est sur que l'on est sur une semaine de l'année N.
    'Tention c'est très français, comme considération.

    Ce qui est assez international avec les calendriers grégoriens et juliens, c'est :
    - Le pays choisit un jour pour être le premier de la semaine. (Lundi chez nous, dimanche aux US, autre chose...)
    - Le pays choisit le nombre minimum de jours qui doivent faire partie de l'année pour que la semaine qui les contient soit la première semaine de l'année. (Chez nous, c'est la semaine du premier jeudi de l'année, et vu qu'on commence au lundi ça veut dire 4 jours minimum.)

    La classe Calendar accepte qu'on règle ces deux choses, et fait les calculs de jour, de semaine et d'année en conséquence.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Comme dit Elvin, tout d'abord tu dois savoir ce que tu considère comme
    "Le premier jour de la semaine" (dimanche, lundi, samedi?) Ca dépend de la région du monde
    "Le nombre jour qu'il faut dans une semaine pour qu'elle puisse être la première" (1,3,...?)

    A partir de là, les méthodes
    void setFirstDayOfWeek(int value)
    void setMinimalDaysInFirstWeek(int value)

    te serviront

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    J'avais compris cela en me documentant sur les différentes méthodes de calcul, mais j'avoues que tout cela est assez complexe (heureusement qu'il n'y a aucun pays avec 8 jours dans une semaine).

    Dans mon cas, je n'ai qu'à me soucier de la norme française, c'est à dire que la semaine civile commence le Lundi pour finir le Dimanche et que les règles pour la numération des semaines est celle décrite plus haut.

    Par contre, après quelques tests, mon code ci dessus ne marche pas complètement, je vais donc le supprimer.

    Merci pour tous vos conseils sans lesquels je me serai arraché quelques cheveux.

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par RomG7 Voir le message
    les règles pour la numération des semaines est celle décrite plus haut.
    Attention que ce n'est pas une "norme française" ça De plus tu aura toujours le problème en fin d'année (le dernier "bout de semaine" appartenant systématiquement à la première semaine de l'année suivante, il sera numéroté 1 (ou 0 je sais plus))

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par RomG7 Voir le message
    J'ai fais quelques recherche de mon coté, effectivement si le 1er janvier de l'année N est un vendredi, samedi ou dimanche, cette semaine appartiendra a la semaine de l'année N-1 car elle n'aura que 3 jours sur 7 sur l'année N.

    De même pour le 31 décembre de l'année N, si c'est un Lundi, Mardi ou Mercredi, la semaine appartiendra à la semaine de l'année [N+1] car elle n'aura que 3 jours sur 7 sur l'année N.
    Normalement, cette méthode est celle appliquée à nos calendrier, enfin c'est ce que j'avais pu comprendre?

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Dans nos calendrier, il faut au moins 4 jours dans la semaine pour qu'elle fasse partie de l'année courante. C'est le comportement par défaut du GregorianCalendar avec la Locale française.

    J'ai cru comprendre à vos message que vous vouliez que le Calendrier aie d'office le 1er janvier dans la première semaine Et ça c'est pas "la norme française"

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Non justement, je voudrais vraiment que cela respecte notre norme. J'ai eu autant de mal à m'expliquer qu'à digérer tous ce que j'avais pu lire à ce sujet

    Je vais essayer de mettre en place cette satané fonction avec tous ce que vous avez pu m'indiquer comme méthode de l'objet Calendar mais c'est pas gagné, pourtant c'est pas faute d'essayer.

  14. #14
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    La première semaine de l'année peut varier selon la locale. Chacune pouvant avoir un nombre de jour minimum différent pour la première semaine de l'année...

    Donc on est bien obligé d'utiliser Calendar pour récupérer le numéro de la semaine.


    Maintenant si on veut avoir l'année correspondant, il suffit de faire une petite vérification tout simple :
    • Si en janvier on a une semaine > 50, il faut enlever une année.
    • Si en décembre on a une semaine à 1, il faut rajouter une année.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	Calendar cal = Calendar.getInstance(Locale.FRANCE);
    	cal.setTime(dateInc);
     
    	int month = cal.get(Calendar.MONTH);
    	int week = cal.get(Calendar.WEEK_OF_YEAR);
    	int year = cal.get(Calendar.YEAR);
     
    	if (week == 1 && month == Calendar.DECEMBER)
    		year++;
    	else if (week > 50 && month == Calendar.JANUARY)
    		year--;
     
    	System.out.println("n° semaine : " + week);
    	System.out.println("Année  : " + year);

    A la rigueur on peut même paramétrer tout cela selon le Calendar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    	Calendar cal = Calendar.getInstance(Locale.FRANCE);
    	cal.setTime(dateInc);
     
    	int month = cal.get(Calendar.MONTH);
    	int week = cal.get(Calendar.WEEK_OF_YEAR);
    	int year = cal.get(Calendar.YEAR);
    	int minWeek = cal.getActualMinimum(Calendar.WEEK_OF_YEAR);
    	int maxWeek = cal.getActualMaximum(Calendar.WEEK_OF_YEAR);
    	int firstMonth = cal.getActualMinimum(Calendar.MONTH);
    	int lastMonth = cal.getActualMaximum(Calendar.MONTH);
     
    	if (week == minWeek && month == lastMonth)
    		year++;
    	else if (week >= maxWeek-1 && month == firstMonth)
    		year--;
     
    	System.out.println("n° semaine : " + week);
    	System.out.println("Année  : " + year);

    a++

  15. #15
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Maintenant si on veut avoir l'année correspondant, il suffit de faire une petite vérification tout simple :
    • Si en janvier on a une semaine > 50, il faut enlever une année.
    • Si en décembre on a une semaine à 1, il faut rajouter une année.
    Aaaah, voilà. Je me disais bien qu'il devait y avoir plus simple, mais je n'arrivais pas à mettre le doigt dessus.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Je cherchais depuis le départ midi à quatorze heure alors que la réponse était assez simple. J'avais réussi à faire cette fonction vérifiant uniquement l'année pour le 1, 2 et 3 janvier et pour le 29, 30 et 31 décembre, car c'est uniquement sur ces dates que l'année peut être différente de l'année N.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    // retourne la concaténation du numéro de semaine et de l'année pour une date de votre choix
    public static String getYearWeekInDate(Date dateInc) {
       Calendar cal = new GregorianCalendar(Locale.FRANCE);
       cal.setFirstDayOfWeek(Calendar.MONDAY);
       cal.setMinimalDaysInFirstWeek(4);
       cal.setTime(dateInc);
     
       int semaineInc = cal.get(Calendar.WEEK_OF_YEAR);
       int anneeInc = cal.get(Calendar.YEAR);
     
       // Supérieur au 3 janvier, on est sur que l'année sera celle de l'année N 
       if (cal.get(Calendar.MONTH) == Calendar.JANUARY && cal.get(Calendar.DATE) <= 3) {
          if (semaineInc > 1) anneeInc -= 1;
       }
     
       // Inférieur au 29 décembre, on est sur que l'année sera celle de l'année N
       if (cal.get(Calendar.MONTH) == Calendar.DECEMBER && cal.get(Calendar.DATE) >= 29) {
          if (semaineInc == 1) anneeInc += 1;
       }
     
       return Integer.valueOf(semaineInc) + "-" + Integer.toString(anneeInc);
    }
    J'avais une dernière petite question concernant l'objet Calendar. Qu'elle différence y a t-il entre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       Calendar cal = Calendar.getInstance(Locale.FRANCE);
       cal.clear();
       cal.setTime(dateJour);
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       GregorianCalendar cal = new GregorianCalendar(Locale.FRANCE); 
       cal.setTime(dateJour);
    Vue que j'utilise souvent cet objet, je voulais savoir qu'elle méthode était la plus propre?

    Merci à tous pour vos réponse qui me sont d'une grande utilité et m'ont permis de me familiariser un peu plus avec l'utilisation des dates dans Java.

  17. #17
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par RomG7 Voir le message
    J'avais réussi à faire cette fonction vérifiant uniquement l'année pour le 1, 2 et 3 janvier et pour le 29, 30 et 31 décembre, car c'est uniquement sur ces dates que l'année peut être différente de l'année N.
    C'est un peu bête de te limiter à ces 6 jours. Cela ne coute pas plus cher de vérifier cela simplement pour les mois de janvier/décembre (sans regarder le jour) et cela permet d'avoir un code plus générique (qui s'adaptera éventuellement à d'autre locale qui peuvent avoir des règles différentes).




    Citation Envoyé par RomG7 Voir le message
    J'avais une dernière petite question concernant l'objet Calendar.
    Dans ce cas précis il n'y a aucune différence.
    Toutefois l'utilisation de Calendar.getInstance() est plus générique et donc plus propre. Cette méthode peut renvoyer d'autre type de Calendar selon la locale...


    a++

  18. #18
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Ok, merci pour toutes ces infos.
    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Obtenir que le mois ou l'année d'une date.
    Par nomade333 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 27/09/2013, 10h11
  2. [Debutant] récupérer l'année d'une date
    Par petitelulu dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 27/10/2004, 15h28
  3. Récupérer le mois et l'année d'une date
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 23/09/2003, 09h17
  4. requête sur l'année d'une date
    Par jo77 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/07/2003, 09h28
  5. Récupérer l'année d'une date
    Par delphim dans le forum Langage SQL
    Réponses: 3
    Dernier message: 15/01/2003, 16h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo