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

Langage Java Discussion :

[Android] Gestion de dates et jours fériés


Sujet :

Langage Java

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 70
    Points : 96
    Points
    96
    Par défaut [Android] Gestion de dates et jours fériés
    Bonjour,

    Je rencontre un problème dans la manipulation de dates.

    J'utilise un fichier Excel que je convertis en XML et qui s'installe sur la SDCard du téléphone.

    Dans ce fichier se trouve différentes colonnes dont une colonne "jour". Dans celle-ci je mets les numéros du jour qui correspondent aux samedis de chaque semaine de l’année... Je mets aussi les jours fériés quand il y en a.
    Exemple: je mets 22 pour ce samedi 22/12/212 et le 25 pour mardi 25/12/12)

    Voici mon 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    // Ici j'indique les jours fériés
    int ferie[] = {1125};
     
    // j'obtiens la date actuelle        
            final Calendar c = Calendar.getInstance();        
            int mYear = c.get(Calendar.YEAR);        
            int mMonth = c.get(Calendar.MONTH);        
            int mDay = c.get(Calendar.DAY_OF_MONTH);
     
    // je récupère le numéro dans le fichier xml
            int cDay=c.get(Calendar.DAY_OF_WEEK);
     
            int ref = 8;
            int diff = ref - cDay;
     
            try {
                url = new java.net.URL("http://android.assistech.fr/pharmacie/" + XML);
            } catch (MalformedURLException e1) {
                e1.printStackTrace();
            }
     
            Date date;
            if (cDay != 1)
            {
                date = new Date(mYear, mMonth, mDay + diff);
                for (ref = 0; ref != 8; ref++)
                {
    // je code ici pour le jour férié que je récupère au niveau de la date (1125, 11 car janvier=0 donc décembre=11 etc...)
                    c.add(Calendar.DATE, 1);
                    int mMonth2 = c.get(Calendar.MONTH);        
                    int mDay2 = c.get(Calendar.DAY_OF_MONTH);
                    String tmp = String.valueOf(mMonth2) + String.valueOf(mDay2);
     
                    for (int i = 0; i < ferie.length; i++)
                    {
                        if (tmp.equals(String.valueOf(ferie[i])))
                            date = new Date(mYear, mMonth, mDay + ref + 1);
                    }
                }
            }
            else {
                date = new Date(mYear, mMonth, mDay);
            }
     
            int Dimproch = date.getDate();
    Ce que je veux faire :
    A partir de la date du jour (aujourd'hui par exemple), l'application doit tomber sur le samedi.
    Exemple : trouver le 22 dans mon fichier XML et me donner les infos du 22/12/12. A partir du 24 l'application doit me donner les infos lorsqu'un jour férié tombe dans la semaine exemple le 25 (la date du 25/12/12). Je prends ces dates en exemple mais cela doit se répéter chaque semaine de l'année et à chaque fois qu'il y a un jour férié.

    Le problème :
    L'application me donne directement les infos du 25 au lieu du 23.

    Ce qui marche:
    Sans les jours fériés ça fonctionne.

    Je pense que cela vient d'une mauvaise programmation pour le jour férié vu que lorsque je me passe des jours fériés ça fonctionne.
    J'ai cherché sur le forum mais je n'ai rien trouvé.

    Quelqu'un saurait-il m'indiquer comment résoudre ce problème ?

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Bonjour,

    Si j'ai bien compris... tu veux une fonction qui te renvoie la date du prochain samedi et/ou jour férié...

    D'abord une remarque... "Date" est un type ostensiblement "UTC", donc non adapté au travail sur les dates calendaires, mais particulièrement adaptées aux dates séquentielles.... Ainsi, lors des changement d'heure, les objets "Date" sont toujours consécutifs... pas forcément les date calendaires (retour d'une heure en arrière).
    A l'inverse, Calendar (et son implémentation "calendrier grégorien" GregorianCalendar) est axé dans ce sens....

    Il me semble que tu programmes "à l'envers" la logique (ce n'est pas un reproche hein ! juste une constatation, sans doute dû d'ailleurs à la formulation du problème, dans le "ce que je veux faire").
    "Ce que j'ai compris" c'est bien renvoyer la date du prochain samedi, ou du premier jour ferié avant ce samedi.

    Donc on devrait partir du samedi, (facile à trouver), et RECULER de jour en jour.... Donc à priori, déjà, deux fonctions:
    La première récupérer le samedi suivant:
    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
    Calendar  getNextSaturday(final Calendar since)
    {
        Calendar c= Calendar.getInstance(); ret.setTime(since.getTime());
     
        int weekDay = since.get(Calendar.DAY_OF_WEEK);
        int diff = (weekDay - Calendar.SATURDAY) % 7; 
        if (diff <= 0) diff += 7;
        // à noter que si 'aujourd'hui est samedi' doit retourner aujourd'hui... juste changer <= par <
     
        // on rajoute la différence
        c.add(Calendar.DATE,diff);
        // on met à 0 les heures, minutes, secondes, etc...
        for (int field = Calendar.HOUR_OF_DAY; field <= Calendar.MILLISECOND;) 
            c.set(field++,0);
        // et voila, on a une date calendaire à 00:00:000 le prochain samedi...
        return c;
    }
    Maintenant on va regarder les jours feriés...
    Déjà, quelques soucis dans ton code:
    int ferie[]={1125}; d'après toi veut dire 25 décembre... Comment seront notés le 2 décembre ? (112) et le 12 janvier ? (112)...
    Je dis ça, parce qu'un peu plus loin dans le code tu fais:
    String tmp = String.valueOf(mMonth2)+String.valueOf(mDay2);Bref, sans séparateur jour/mois, point de salut....
    Et comment faire le 31 décembre, si le prochain samedi est bien le 4 janvier 2013 et le prochain jour férié le 1 janvier 2013 ?

    Je pense qu'il vaut mieux stocker des dates calendaires ici aussi... (donc un tableau de Calendar[]), pour des raisons de sémantiques avant-tout (quitte à passer un peu plus de temps à la traduction du fichier XML). Non seulement cela simplifiera le "debug" du code, mais aussi la compréhension quand celui ci aura dormi pendant 10 mois

    On peut aussi stocker un tableau de String[], mais bien penser à un séparateur entre jour/mois et année.... Bref... un DateFormat quoi ! Donc bon... ne sachant pas comment est stocké la valeur dans le XML (pourquoi pas utiliser un simple CSV d'ailleurs ? ou juste une liste de lignes... enfin je m'égare).

    Donc partons du principe qu'on a des 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
    19
    20
    21
    22
    // une fonction pour éviter les erreurs de copier/coller de code
    public boolean isSameOrNextDay(Calendar c1, Calendar c2)
    {
        return (c1.getTime() - c2.getTime()) <= 86400000;
    }
     
    public Calendar getNextUnworkedDay(Calendar since)
    {
        Calendar saturday = getNextSaturday(since);
     
        Calendar ret = Calendar.getInstance().setTime(saturday.getTime()); 
        boolean isNextDay = isSameOrNextDay(ret,since);
        while (!isNextDay ) {
            ret.add(Calendar.DATE,-1); // on recule d'un jour 
            if (isNotWorked(ret))
                return ret;
            isNextDay = isSameOrNextDay(ret,since);
        }    
     
        // on renvoit le résultat....
        return ret;
    }
    Reste donc plus qu'à coder le 'isNotWorked' (exemple avec un hash-set de String, permettant de trouver la chaine plus vite)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public boolean isNotWorked(Calendar c)
    {
        // doit être fait de manière statique quelque part à priori
        HashSet<String> joursFeries = new HashSet<String>();
        ferie.add("12/25");
        ferie.add("01/01");
     
        // on utilise DateFormat pour convertir un Calendar en une chaine...
        SimpleDateFormat df = new SimpleDateFormat ("MM/DD"); // je suis plus trop sur de 'DD'
        String cmp = df.format(c);
        return joursFeries.contains(cmp);
    }
    Bien entendu, on peut rajouter les utilitaires suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public Calendar getNextSaturday()
    {
        return getNextSaturday(Calendar.getInstance());
    }
     
    public Calendar getNextUnworkedDay()
    {
        return getNextUnworkedDay(Calendar.getInstance());
    }
     
    public Date getNextUnworkedDate()
    {
        return getNextUnworkedDay().getTime();
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 70
    Points : 96
    Points
    96
    Par défaut
    Merci beaucoup nicroman. Dans un premier temps j'ai trouvé une solution dans l'attente de retravailler le code. J'ai changer mon fichier xml pour étre sur de tomber sur le bon jour.

    La période va être difficile pour trouver le temps de faire mieux... mais j'écouterai vos conseils.

    Encore merci et que tout le monde passe de bonnes fêtes de fin d'année.

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 70
    Points : 96
    Points
    96
    Par défaut
    La solution a été de mettre l'heure à 0.

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

Discussions similaires

  1. [Dates] Algorithme de jours fériés
    Par franfr57 dans le forum Langage
    Réponses: 18
    Dernier message: 13/05/2012, 17h38
  2. Réponses: 3
    Dernier message: 09/09/2010, 18h47
  3. [Python2.4] Comment savoir si une date est jour férié ou pas ?
    Par Ekimasu dans le forum Général Python
    Réponses: 10
    Dernier message: 30/03/2007, 17h34
  4. Date - Jour férié
    Par JohnNC dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 16/10/2006, 03h01
  5. [Dates] Gestion d'un calendrier avec les jours fériés
    Par maximenet dans le forum Langage
    Réponses: 4
    Dernier message: 05/05/2006, 09h41

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