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 :

Manipulation de dates


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Par défaut Manipulation de dates
    Bonjour à tous, j'éprouve beaucoup de difficulté pour manipuler les dates dans mon programme java.

    1 - Pour commencer je voudrais que l'utilisateur puisse saisir une date de départ et une date de fin. Pour se faire j'ai utilisé les objets de types JSpinner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    spDateDeb = new JSpinner(new SpinnerDateModel(dateJour, dateMin, dateMax, Calendar.YEAR));
    spDateDeb.setEditor(new DateEditor(spDateDeb, "dd/MM/yyyy"));
     
    spDateFin = new JSpinner(new SpinnerDateModel(dateJour, dateMin, dateMax, Calendar.YEAR));
    spDateFin.setEditor(new DateEditor(spDateFin, "dd/MM/yyyy"));
    Donc dans ce code, mes JSpinner sont initialisés au format date française jour/mois/année. Ma première difficulté est pour lire la valeur sélectionnée dans le JSpinner. Voici le code que j'essaye de mettre en place mais cela ne fonctionne pas car je pense que c'est un problème de format de date ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.sql.Date dateInc = (Date) spDateDeb.getValue();
    2 - Ensuite je voudrais connaitre le numéro du jour, si c'est un lundi je voudrais que le numéro du jour soit 1 mardi 2 ... et dimanche 7.
    Pour se faire, j'utilise des objets de types GregorianCalendar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(dateJour);
    int numJour = cal.get(Calendar.DAY_OF_WEEK);
    Le problème est que le dimanche est le jour numéro 1 de la semaine au USA alors que moi je souhaiterai que ce soit le lundi. Existe t'il une solution assez simple pour répondre à mon besoin? Pour l'instant j'ai fais cette petite bidouille pour obtenir le résultat souhaité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int numJour = cal.get(Calendar.DAY_OF_WEEK) == 1 ? 7 : cal.get(Calendar.DAY_OF_WEEK) - 1
    3 - Enfin pour finir, je souhaiterai connaitre le nombre de semaine qui sépare ma date de début et ma date de fin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    long diff =  dateFin.getTime() - dateDeb.getTime();
    long nbJour = (diff / (1000 * 60 * 60 * 24)); 
    long nbSemaine = nbJour / 7;
    Ce code marche bien dans la plupart des cas mais mon problème principal est que je voudrais qu'il compte les semaines civiles du lundi au dimanche.
    Par exemple si la date de début est dimanche 24 décembre 2010 et la date de fin est le lundi 25 décembre 2010, je voudrais qu'il compte 1 semaine car le dimanche est le dernier jour de ma première semaine. En Visual Basic, il existait une fonction DateDiff qui prenait en paramètre la date de début, la date de fin et le premier de jour de la semaine civile.
    Existe t-il une fonction similaire en Java?

    L'application que je développe devra faire beaucoup de calcul en fonction de dates et je trouve la manipulation de dates assez complexe comme pour tous les langages.

  2. #2
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,

    pour le jour de la semaine je pense que setFirstDayOfWeek devrait te convenir.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Par défaut
    J'avais déjà essayé d'utiliser cette méthode mais cela ne marche pas ou alors je n'ai pas bien compris son utilité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    GregorianCalendar cal = new GregorianCalendar();
     
    cal.setFirstDayOfWeek(Calendar.MONDAY);		
    cal.setTime(dateJour);
     
    System.out.println(cal.get(Calendar.DAY_OF_WEEK));
    Pour le lundi, le numéro du jour est toujours le 2 alors que je voudrais que ce soit le 1.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Par défaut
    Je crois que tu fais une petite confusion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    GregorianCalendar cal = new GregorianCalendar(2010, Calendar.NOVEMBER, 15);		        
            cal.setFirstDayOfWeek(Calendar.MONDAY);
     
            if (cal.get(Calendar.DAY_OF_WEEK) == cal.getFirstDayOfWeek()) {
            	System.out.println("Premier Jour de la semaine");
            }
            else {
            	System.out.println("Pas le premier jour de la semaine");
            }
    Quand tu fais un appel à cal.get(Calendar.DAY_OF_WEEK) il te renvoit un entier qui est le numéro du jour de la semaine (http://download.oracle.com/javase/1....ml#DAY_OF_WEEK) et pas à l'ordre des jours dans la semaine.

  5. #5
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Citation Envoyé par RomG7 Voir le message
    3 - Enfin pour finir, je souhaiterai connaitre le nombre de semaine qui sépare ma date de début et ma date de fin.
    Quelque chose comme ça (il faut faire une correction si les deux dates ne sont pas de la même année) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Calendar c = Calendar.getInstance();
    c.setFirstDayOfWeek(Calendar.MONDAY);
     
    c.setTime(dateDeb);
    int semaineDeb = c.get(Calendar.WEEK_OF_YEAR);
    c.setTime(dateFin);
    int semaineFin = c.get(Calendar.WEEK_OF_YEAR);
     
    int nbSemaine = semaineFin - semaineDeb;

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

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Par défaut
    Merci à tous pour vos conseil,

    En fait cela m'aurait vraiment arranger pour des raisons techniques que le numéro du jour soit 1 quand le jour de la semaine est un lundi. J'ai résolu ce problème avec cette petite fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int numJour = cal.get(Calendar.DAY_OF_WEEK) == 1 ? 7 : cal.get(Calendar.DAY_OF_WEEK) - 1;
    Ensuite pour connaitre le nombre de semaine civile entre 2 dates, herve91, ce que vous me proposez est très intéressant mais le problème est que les dates ne seront pas forcément de la même année, donc difficile a mettre en place.
    Pour palier à ce problème j'ai fais une boucle entre les 2 dates et je compte le nombre de lundi pour connaitre le nombre de semaine civile. Je trouve pas ça très jolie mais ça a le mérite de marcher

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

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Par défaut
    J'aurais voulu avoir votre avis en ce qui concerne la question 1 du premier post.
    J'initialise donc les JSpinner comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SpinnerDateModel model = new SpinnerDateModel(dateJour, dateMin, dateMax, Calendar.YEAR);
    JSpinner spDateDeb = new JSpinner(model);
    spDateDeb.setEditor(new DateEditor(spDateDeb, "dd/MM/yyyy"));
    Et je lis la valeur comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SpinnerDateModel model = (SpinnerDateModel) spDateDeb.getModel();
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(model.getDate());
     
    System.out.println(new Date(cal.getTimeInMillis()));
    Je trouve vraiment que c'est de la torture pour lire et écrire des dates.
    Si quelqu'un à des conseils a me donner dans l'utilisation des dates ou quelques lien a me proposer, je suis preneur.

    Je voudrais savoir aussi si vous utilisez d'autres contrôles que les Jspinner pour la saisie des dates, genre des date picker ou un truc du genre, si oui je suis très très très intéressé.

    Bonne continuation à tous

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par RomG7 Voir le message
    En fait cela m'aurait vraiment arranger pour des raisons techniques que le numéro du jour soit 1 quand le jour de la semaine est un lundi.
    Pas grand-chose à faire. Calendar.SUNDAY, Calendar.MONDAY... Calendar.SATURDAY, tout ça, ce sont des constantes, et comme toutes les constantes, elles ne changeront pas.
    Officiellement tu n'es pas censé t'intéresser à leurs valeurs, tu es plutôt censé faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    switch(int day) {
      case Calendar.MONDAY: return 1;
      case Calendar.TUESDAY: return 2;
      // ...
      case Calendar.SUNDAY: return 7;
      default: throw new IllegalArgumentException("Invalid calendar day: " + day);
    }
    Officieusement, ta méthode est souvent utilisée.

    Je trouve vraiment que c'est de la torture pour lire et écrire des dates.
    Pour définir le JSpinner il n'y a rien à faire, il ne va pas deviner le format que tu veux utiliser.

    Pour lire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SpinnerDateModel model = (SpinnerDateModel) spDateDeb.getModel();
    Date date = model.getDate();
     
    System.out.println(date);
    Et rien ne t'empêche de garder une référence vers le model lors de sa création si tu veux pas le caster à chaque fois.
    Le Calendar je vois pas ce qu'il faisait là, les millisecondes non plus.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Informations forums :
    Inscription : Février 2009
    Messages : 64
    Par défaut
    Merci pour ta réponse rapide,

    En fait j'utilise la classe java.sql.Date. Si je l'initialise sans le Calendar j'ai une erreur.

    En fait j'utilise la classe java.sql.Date et non pas la classe java.util.Date à tort ou à raison je ne sais pas car je m'en sers pour les requêtes SQL.

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    N'utilise java.sql.Date que quand tu communiques avec la BDD. Le reste du temps, utilise java.util.Date.

    De toute façon, java.sql.Date est une sous-classe de java.util.Date. Il est donc tout-à-fait possible de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.util.Date date = myResultSet.getDate("NOM_COLONNE");
    Ou la même chose plus tard. Les deux sont assez faciles à convertir l'une en l'autre, mais il n'y a pas de raison de se l'imposer avant d'écrire en BDD.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Manipulations de dates et heures
    Par benj63 dans le forum C++
    Réponses: 5
    Dernier message: 16/12/2004, 15h09
  2. [JDBC] manipulation des dates/heures en Java
    Par kurkLord dans le forum JDBC
    Réponses: 6
    Dernier message: 09/08/2004, 12h49
  3. Manipulations des Dates
    Par kurtc dans le forum Langage SQL
    Réponses: 11
    Dernier message: 13/04/2004, 14h39
  4. [IB6][BCB5]Manipulation des dates.
    Par Sitting Bull dans le forum SQL
    Réponses: 4
    Dernier message: 09/04/2004, 15h33
  5. Manipuler des dates...
    Par Ti Jen-tsie dans le forum Langage
    Réponses: 4
    Dernier message: 26/06/2003, 11h46

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