Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 18/12/2012, 16h26   #1
assistech
Nouveau Membre du Club
 
Homme
Inscription : janvier 2012
Messages : 58
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : janvier 2012
Messages : 58
Points : 27
Points : 27
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.
assistech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 00h20   #2
nicroman
Modérateur
 
Homme Nicolas Romantzoff
Ingénieur systèmes et réseaux
Inscription : février 2007
Messages : 2 857
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 : 2 857
Points : 4 892
Points : 4 892
Envoyer un message via Skype™ à nicroman
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
nicroman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 15h32   #3
assistech
Nouveau Membre du Club
 
Homme
Inscription : janvier 2012
Messages : 58
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : janvier 2012
Messages : 58
Points : 27
Points : 27
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.
assistech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2013, 11h34   #4
assistech
Nouveau Membre du Club
 
Homme
Inscription : janvier 2012
Messages : 58
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : janvier 2012
Messages : 58
Points : 27
Points : 27
La solution a été de mettre l'heure à 0.
assistech est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h33.


 
 
 
 
Partenaires

Hébergement Web