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

Groovy Java Discussion :

Lister les derniers jours du mois entre 2 dates


Sujet :

Groovy Java

  1. #1
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 484
    Points : 873
    Points
    873
    Par défaut Lister les derniers jours du mois entre 2 dates
    Bonjour à tous,

    le code ci-dessous me permet de lister les derniers jours de mois entre 2 dates, c'est à dire que si ma date de départ est 06.03.2012 et ma date de fin 12.12.2012 alors il me retourne:
    31.03.2012
    30.04.2012
    ...
    30.11.2012
    31.12.2012

    voici le 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
    import java.util.Calendar;
    import java.text.*;
     
    // parameters
    startDate='06.03.2012';
    endDate='12.12.2012'
     
    SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");  
     
    // convert start and end params as Date
    Date startDateAsDate=sdf.parse(startDate);
    Date endDateAsDate=sdf.parse(endDate);
     
    Date currentDate=startDateAsDate;
     
    Calendar currCal=Calendar.getInstance();
    Calendar endCal=Calendar.getInstance();
     
    currYear=currentDate.format('yyyy').toInteger();
    currMonth=currentDate.format('M').toInteger()-1;
    currDay=currentDate.format('M').toInteger();
     
    endYear=endDateAsDate.format('yyyy').toInteger();
    endMonth=endDateAsDate.format('M').toInteger()-1;
    endDay=endDateAsDate.format('M').toInteger();
     
    currCal.set(currYear,currMonth,currDay);
    endCal.set(endYear,endMonth,endDay);
    endCal.add(Calendar.MONTH,1);
     
    while (currCal<=endCal)
    {
        currCal.set(Calendar.DAY_OF_MONTH,currCal.getActualMaximum(Calendar.DAY_OF_MONTH));
        println sdf.format(currCal.getTime());
         currCal.add(Calendar.MONTH,1);
    }
    il fonctionne très bien mais j'aurais souhaité un retour car je pense qu'il y avait bien plus simple et plus optimal (java/groovy n'est pas ma spécialité)

    D'avance merci !
    laloune
    Consultant B.I.
    Spécialité(s): Excel, SQL, Business Intelligence (Jedox Palo, Talend)

    "A problem worthy of attack proves its worth by fighting back." Piet Hein

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hum.

    Eh bien, déjà tu peux remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    currYear=currentDate.format('yyyy').toInteger();
    currMonth=currentDate.format('M').toInteger()-1;
    currDay=currentDate.format('M').toInteger();
     
    endYear=endDateAsDate.format('yyyy').toInteger();
    endMonth=endDateAsDate.format('M').toInteger()-1;
    endDay=endDateAsDate.format('M').toInteger();
     
    currCal.set(currYear,currMonth,currDay);
    endCal.set(endYear,endMonth,endDay);
    Par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    currCal.setTime(currentDate);
    endCal.setTime(endDate);
    Une fois que t'as fait ça, y a pas grand-chose à simplifier. En théorie la méthode la plus simple est d'utiliser la magie du getActualMaximum() et du add(Calendar.MONTH, 1)

    En Java 8, cette magie est bien plus simple d'accès : le code peut être écrit comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyy");
     
    YearMonth start = formatter.parse(startDate, YearMonth::from);
    YearMonth end = formatter.parse(endDate, YearMonth::from);
     
    while(start.compareTo(end) <= 0) {
      System.out.println(start.atEndOfMonth());
      start = start.plusMonths(1);
    }
    En gros on nous épargne de gérer nous-même le Calendar, du moment qu'on représente le temps directement avec les types adaptés : YearMonth parce que le but est d'itérer sur les mois et lister leurs derniers jours.
    Le type YearMonth est capable de calculer le mois suivant et la dernière date calendaire qu'il contient. Ce qui évite de le demander à un Calendar.

    Ne connaissant pas Groovy, je serais incapable de te dire comment faire ça en Groovy, par contre.
    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. [VxiR2] Calcul du nombre de jours par mois entre deux date
    Par trabelsi dans le forum Designer
    Réponses: 4
    Dernier message: 02/10/2017, 15h17
  2. Trouver le dernier jour du mois précédant la date entrée
    Par lolafrite dans le forum Langage SQL
    Réponses: 5
    Dernier message: 22/12/2010, 12h01
  3. [AC-2007] Calcul du nombre de jours par mois entre deux dates
    Par arouxy dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/01/2010, 08h34
  4. Réponses: 6
    Dernier message: 12/01/2008, 18h21
  5. Comment compter les jours par mois entre deux dates
    Par Doo89 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 10/01/2008, 21h21

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