Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Nouveau Membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2012
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : janvier 2012
    Messages : 64
    Points : 31
    Points
    31

    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 :
    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
    Modérateur

    Homme Profil pro Nicolas Romantzoff
    Ingénieur systèmes et réseaux
    Inscrit en
    février 2007
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Nom : Homme Nicolas Romantzoff
    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 : 3 692
    Points : 6 415
    Points
    6 415

    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 :
    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 :
    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 :
    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 :
    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
    Nouveau Membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2012
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : janvier 2012
    Messages : 64
    Points : 31
    Points
    31

    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
    Nouveau Membre du Club
    Homme Profil pro
    Inscrit en
    janvier 2012
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : janvier 2012
    Messages : 64
    Points : 31
    Points
    31

    Par défaut

    La solution a été de mettre l'heure à 0.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •