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

avec Java Discussion :

ne récupère pas le bon numéro de semaine


Sujet :

avec Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut ne récupère pas le bon numéro de semaine
    Bonjour,

    je souhaite récupérer le numéro de semaine dans l'année de la semaine en cours à partir de la date du jour. Nous sommes actuellement en semaine 11, et par le code je récupère la semaine 12, ce qui fausse mes résultats...

    VOici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    GregorianCalendar calendar =new GregorianCalendar();
    calendar.getInstance();
    java.util.Date date2 = new java.util.Date();
    calendar.setTime(date2);
    int semaine =calendar.get(calendar.WEEK_OF_YEAR);
    System.out.println(semaine);
    Est-ce lié au type de mon calendar?

    Merci de votre aide.

  2. #2
    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,


    La numérotation des semaines peut varier selon les paramètres régionaux...

    Tu ne précises pas la locale, donc tu utilises implicitement la locale par défaut (Locale.getDefault()) qui ne correspond pas forcément à celle que tu souhaites...

    Il serait préférable d'indiquer cette locale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	Calendar calendar = Calendar.getInstance(Locale.FRANCE);
    	int semaine = calendar.get(Calendar.WEEK_OF_YEAR);
    	System.out.println(semaine);
    a++

  3. #3
    Membre confirmé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Points : 503
    Points
    503
    Par défaut
    Essaye plutot comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Calendar calendar = Calendar.getInstance();
                System.out.println(calendar.get(Calendar.WEEK_OF_YEAR));
    A lire aussi les cours et tutoriels programmation Java : http://java.developpez.com/cours/

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    Suite à vos conseils j'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //GregorianCalendar calendar =new GregorianCalendar();
    Calendar calendar = Calendar.getInstance(Locale.FRANCE);
    int semaine =calendar.get(calendar.WEEK_OF_YEAR);
    System.out.println(semaine);
    ou ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //GregorianCalendar calendar =new GregorianCalendar();
    Calendar calendar = Calendar.getInstance();
    int semaine =calendar.get(calendar.WEEK_OF_YEAR);
    System.out.println(semaine);


    et je récupère toujours 12 au lieu de 11

  5. #5
    En attente de confirmation mail
    Inscrit en
    Octobre 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 127
    Points : 112
    Points
    112
    Par défaut
    Salut
    en fait ce problème e dépend de La définition de la première semaine de l'année
    pour résoudre ce problème tu peut lire la doc suivante
    http://java.sun.com/j2se/1.4.2/docs/...tWeek%28int%29
    l'idée est de spécifier le premier jour de la première semaine via la méthode
    setMinimalDaysInFirstWeek() et ajouter votre local
    exp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GregorianCalendar calendar = new GregorianCalendar(Locale.FRANCE);
    bonne chance

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    en effet j'ai fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    GregorianCalendar calendar =new GregorianCalendar(Locale.FRANCE);
    Calendar.getInstance();
    calendar.setFirstDayOfWeek(1);
    calendar.setMinimalDaysInFirstWeek(5);
    int semaine =calendar.get(calendar.WEEK_OF_YEAR);
    System.out.println(semaine);
    mais ce jour change tous les ans, il faudrait récupérer à chaque fois le numéro de jour de la semaine pour la date du 01/01.

    On peut faire ça? si oui je veux bien une piste?

  7. #7
    En attente de confirmation mail
    Inscrit en
    Octobre 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 127
    Points : 112
    Points
    112
    Par défaut
    Salut
    essayer d'ajouter ces lignes à votre code initial
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    GregorianCalendar calendar = new GregorianCalendar(Locale.FRANCE);
    calendar.setMinimalDaysInFirstWeek(3);
    bonne chance

  8. #8
    En attente de confirmation mail
    Inscrit en
    Octobre 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 127
    Points : 112
    Points
    112
    Par défaut
    salut
    effectivement ce jour change chaque année mais tu peut le récupérer via la méthode getMinimalDaysInFirstWeek() et à ne pas oublier de définir votre local et le premier jour de semaine pour votre local(dimanche en US,Lundi en Europe ..)
    bonne chance

  9. #9
    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
    Quelle est la version de Java que tu utilises ?

    a++

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    On ne fait jamais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    calendar.setFirstDayOfWeek(1);
    Cette méthode s'utilise plutôt comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    calendar.setFirstDayOfWeek(Calendar.MONDAY);
    Et le premier jour de la semaine ne change jamais. Pour nous c'est lundi, pour beaucoup de gens c'est dimanche, pour je ne sais plus qui c'est vendredi, mais en tout cas c'est tous les ans pareil.

    (et je précise au hasard que Calendar.MONDAY vaut 2. Ce qui vaut 1 c'est Calendar.SUNDAY)

  11. #11
    En attente de confirmation mail
    Inscrit en
    Octobre 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 127
    Points : 112
    Points
    112
    Par défaut
    salut
    @thelvin le premier jour de la semaine ne change jamais vrai
    mais on parle du premier jour de la première semaine de l'année change (c'est à dire le 01/01 ce jour change d'une année à une autre).
    bonne chance

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Oui d'accord, mais ça n'a pas d'importance.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    une très vieille version, la où je suis c'est le jre 1.4 ça doit donc correspondre à du java 4

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    ce code
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.text.SimpleDateFormat;
    import java.util.Arrays;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Locale;
    import java.util.TimeZone;
     
     
    public class TestDate {
    	public static int getWeek(String dateString) {
    	    try {
    	        SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd",Locale.FRANCE);
     
    	        formatter.setTimeZone(TimeZone.getTimeZone("Europe/Brussels"));
    	        formatter.setLenient(false);
    	        Date d = formatter.parse(dateString);	        
    	        Calendar c = Calendar.getInstance(TimeZone.getTimeZone("Europe/Brussels"),Locale.FRANCE);
    	        c.setTime(d);
    	        return c.get(Calendar.WEEK_OF_YEAR);
    	    } catch (Exception e) {
    	        return -1;
    	    }
    	}
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		String[] dates = new String[]{"2004/2/18", "2010/03/14", "2010/03/15", "2010/03/19", "2010/03/20"};
    		for (String date:dates)
    			System.out.println(date+": "+getWeek(date)+" semaine.");
    	}
     
    }
    Donne des résultat cohérent (semaine qui commence le lundi)
    pas testé avec jdk 1.4

  15. #15
    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
    Apparemment il y a plusieurs bugs concernant les valeurs par défaut retournées par getMinimalDaysInFirstWeek() et getFirstDayOfWeek() pour certaines locales.

    Donc soit tu te met à jours, soit tu fixes toi même ces valeurs...

    a

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    je viens de tester mon code (plus haut) avec une jre 1.4 dans les archive de sun, j'obtiens bien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    2004/2/18: 8 semaine.
    2010/03/14: 10 semaine.
    2010/03/15: 11 semaine.
    2010/03/19: 11 semaine.
    2010/03/20: 11 semaine.
    ce qui est le résultat correct. A moin que sa jre soit un 1.4.0b1 ou un truc du genre, je pense plustot que c'est sont code qui a un problème

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    ce code
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import java.text.SimpleDateFormat;
    import java.util.Arrays;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Locale;
    import java.util.TimeZone;
     
     
    public class TestDate {
    	public static int getWeek(String dateString) {
    	    try {
    	        SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd",Locale.FRANCE);
     
    	        formatter.setTimeZone(TimeZone.getTimeZone("Europe/Brussels"));
    	        formatter.setLenient(false);
    	        Date d = formatter.parse(dateString);	        
    	        Calendar c = Calendar.getInstance(TimeZone.getTimeZone("Europe/Brussels"),Locale.FRANCE);
    	        c.setTime(d);
    	        return c.get(Calendar.WEEK_OF_YEAR);
    	    } catch (Exception e) {
    	        return -1;
    	    }
    	}
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		String[] dates = new String[]{"2004/2/18", "2010/03/14", "2010/03/15", "2010/03/19", "2010/03/20"};
    		for (String date:dates)
    			System.out.println(date+": "+getWeek(date)+" semaine.");
    	}
     
    }
    Cette fonction est intéressante marci, mais elle me retourne 12 aussi...

    Il doit y avoir un problème dans mon code en effet, voici le début de ma classe :

    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
     
    Connection con = null;
    ResultSet objectifs = null;
    String format = "yyyy-MM-dd"; 
    java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat( format ); 
    java.util.Date date = new java.util.Date(); 
    String format2 = "dd/MM/yyyy";
    java.text.SimpleDateFormat formater2 = new java.text.SimpleDateFormat(format2);
    GregorianCalendar calendar =new GregorianCalendar(Locale.FRANCE);
    Calendar.getInstance();
    calendar.setTime(date);
     
    //utilisation de la fonction proposé par tchize_
    int semaine = getWeek(date);
    System.out.println(semaine);
    System.out.println(calendar.get(Calendar.WEEK_OF_YEAR));

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    là je suis largué. java -version te retourne quoi?

    edit: ma fonction travaill avec une String, donc tu n'a certainement pas utilisé la mienne puisque tu passe un java.util.Date. Et on a pas la moindre idée de ce qu'il contient! Si j'utilise un String c'est pour une bonne raison dans ce Thread: c'est indépendant de ton horloge qui n'est pas la meme que la mienne et on teste donc sur des valeur reproductibles

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    512
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juin 2007
    Messages : 512
    Points : 97
    Points
    97
    Par défaut
    J'ai modifié pour reprendre exactement ta version et j'obtiens toujours 12

    ma version de java est : 1.4.2_04

    Merci de ton aide

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    alors plusieurs choses

    D'abord j'ai compté moi même. Nous sommes bien la 12ème semaine

    1/1 -> semaine 1
    4/1 -> semaine 2
    etc. 11/1, 18/1, 25/1, 1/2, 8/2, 15/2, 22/2, 1/3, 8/3, 15/3

    on est la 11ème semaine si tu considère que les premier jours font partie de l'année passée.

    ensuite j'ai lancé une série de dates avec une jdk1.4.2_19 et une jdk_1.4.2_04 (un galère à installer):

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    $ ~/apps/j2re1.4.2_04/bin/java TestDate
    2004/01/01: 1 semaine.
    2004/01/05: 2 semaine.
    2004/01/12: 3 semaine.
    2004/01/19: 4 semaine.
    2004/01/26: 5 semaine.
    2004/02/02: 6 semaine.
    2004/02/09: 7 semaine.
    2004/02/16: 8 semaine.
    2004/03/01: 10 semaine.
    2004/03/08: 11 semaine.
    2004/03/15: 12 semaine.
    2010/01/01: 1 semaine.
    2010/01/04: 2 semaine.
    2010/01/11: 3 semaine.
    2010/01/18: 4 semaine.
    2010/01/25: 5 semaine.
    2010/02/01: 6 semaine.
    2010/02/08: 7 semaine.
    2010/02/15: 8 semaine.
    2010/02/22: 9 semaine.
    2010/03/01: 10 semaine.
    2010/03/08: 11 semaine.
    2010/03/15: 12 semaine.
    $ ~/apps/j2re1.4.2_19/bin/java TestDate
    2004/01/01: 1 semaine.
    2004/01/05: 2 semaine.
    2004/01/12: 3 semaine.
    2004/01/19: 4 semaine.
    2004/01/26: 5 semaine.
    2004/02/02: 6 semaine.
    2004/02/09: 7 semaine.
    2004/02/16: 8 semaine.
    2004/03/01: 10 semaine.
    2004/03/08: 11 semaine.
    2004/03/15: 12 semaine.
    2010/01/01: 53 semaine.
    2010/01/04: 1 semaine.
    2010/01/11: 2 semaine.
    2010/01/18: 3 semaine.
    2010/01/25: 4 semaine.
    2010/02/01: 5 semaine.
    2010/02/08: 6 semaine.
    2010/02/15: 7 semaine.
    2010/02/22: 8 semaine.
    2010/03/01: 9 semaine.
    2010/03/08: 10 semaine.
    2010/03/15: 11 semaine.
    On notera que, pour les deux jvm, il y a un problème en 2004, un problème de fin février, ca pue l'année bissextile ratée.

    -> conclusion: tu n'aura pas de calcul correct avec le calendar sur des jvm 1.4! Essayer de corriger ne servirait à rien.
    -> Proposition: utiliser l'api joda-time, qui embarque ses propre calculs.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Crystal] transformation d'une date en numéro de semaine
    Par barna dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 24/03/2017, 09h41
  2. [C#] Comment récupérer le numéro de semaine d'une date ?
    Par farfadet dans le forum Windows Forms
    Réponses: 9
    Dernier message: 17/07/2013, 16h33
  3. Réponses: 4
    Dernier message: 09/10/2007, 14h09
  4. [Calendar] Problème de numéro de semaine de l'année
    Par gaia_dev dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 29/11/2004, 11h44
  5. Calcul des numéros de semaine d'un calendrier
    Par Invité dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/11/2002, 21h29

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