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 jours fériés


Sujet :

Groovy Java

  1. #1
    Membre confirmé
    Lister les jours fériés
    Bonjour à tous,

    je cherche à lister les jours fériés içi en Bavière (ils n'ont pas les même que chez nous :-)

    j'ai commencé par lister les jours de pâque jusqu'à 2020, et ensuite j'ajoute ou retranche de façon classique pour avoir les jours fériés "mobiles". Sauf que j'ai un problème avec le code ci-dessous:

    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
    import java.text.SimpleDateFormat;
    import java.util.Date;
     
    def mapOsterTage=[
    '2011':'24.04.2011',
    '2012':'08.04.2012',
    '2013':'31.03.2013',
    '2014':'20.04.2014',
    '2015':'05.04.2015',
    '2016':'27.03.2016',
    '2017':'16.04.2017',
    '2018':'01.04.2018',
    '2019':'21.04.2019',
    '2020':'12.04.2020'
    ];
     
    def feiertage=[];
     
    for (i in 2011..2011)
    {
    currOsterTag=mapOsterTage[i.toString()];
    inputFormat= new SimpleDateFormat('dd.MM.yyyy');
    currOsterTagAsDate=inputFormat.parse(currOsterTag);
     
    Calendar cal=Calendar.getInstance()
    // set to Ostertag
    cal.setTime(currOsterTagAsDate);
     
    // Karfreitag
    cal.add(Calendar.DATE,-2);
    feiertage+=inputFormat.format(cal.getTime());
     
    // Ostermontag
    cal.add(Calendar.DATE,+1);
    feiertage+=inputFormat.format(cal.getTime());
     
    println feiertage[0];
    println feiertage[1];
     
    }


    en fait je voudrais que la date à laquelle j'ajoute ou retranche les jours soit fixe, or avec "cal.add" elle évolue au fur et à mesure. Le code ci-dessus produit:

    22.04.2011
    23.04.2011
    Or je souhaiterais:

    22.04.2011
    25.04.2011

    Une idée ?

    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

    Créer un nouveau Calendar à chaque fois, au lieu de modifier celui qui sert de point de départ ?
    Avec clone() par exemple.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Citation Envoyé par thelvin Voir le message
    Créer un nouveau Calendar à chaque fois, au lieu de modifier celui qui sert de point de départ ?
    Avec clone() par exemple.
    ma foi, oui, ça fonctionne parfaitement !

    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
    import java.text.SimpleDateFormat;
    import java.util.Date;
     
    def mapOsterTage=[
    '2011':'24.04.2011',
    '2012':'08.04.2012',
    '2013':'31.03.2013',
    '2014':'20.04.2014',
    '2015':'05.04.2015',
    '2016':'27.03.2016',
    '2017':'16.04.2017',
    '2018':'01.04.2018',
    '2019':'21.04.2019',
    '2020':'12.04.2020'
    ];
     
    def feiertage=[];
     
    for (i in 2011..2011)
    {
    currOsterTag=mapOsterTage[i.toString()];
    inputFormat= new SimpleDateFormat('dd.MM.yyyy');
    currOsterTagAsDate=inputFormat.parse(currOsterTag);
     
    Calendar calendarFix=Calendar.getInstance()
    // set to Ostertag
    calendarFix.setTime(currOsterTagAsDate);
     
    cal=calendarFix.clone();
     
    // Karfreitag
    cal.add(Calendar.DATE,-2);
    feiertage+=inputFormat.format(cal.getTime());
     
    cal=calendarFix.clone();
    // Ostermontag
    cal.add(Calendar.DATE,+1);
    feiertage+=inputFormat.format(cal.getTime());
     
    println feiertage[0];
    println feiertage[1];
     
    }


    c'est moi ou l'utilisaton de Calendar me parait compliquée ? ca doit être moi :-P

    merci infiniment
    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

  4. #4
    Expert éminent sénior
    Salut,

    Citation Envoyé par laloune Voir le message
    c'est moi ou l'utilisaton de Calendar me parait compliquée ? ca doit être moi :-P
    Ce n'est pas la meilleure API standard...
    Mais dans le cas précis c'est surtout un objet mutable, donc si tu le modifies plusieurs fois les modifications s'accumulent...


    Avec Java 8 tu as accès à la nouvelle API Date plus complète (et immuable).




    Sinon pour la date de Paques, il y a un algo assez simple (à recopier) pour récupérer cela de manière efficace : http://fr.wikipedia.org/wiki/Calcul_...thode_de_Meeus
    Exemple en Java (mais cela doit être sensiblement la même chose en Groovy) :
    Code java :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
    	public static Date paques(final int year) {
    		if (year < 1583) {
    			throw new IllegalArgumentException("year="+year);
    		}
    		final int n = year%19;
    		final int c = year/100;
    		final int u = year%100;
    		final int s = c / 4;
    		final int t = c % 4;
    		final int p = (c+8)/25;
    		final int q = (c-p+1)/3;
    		final int e = (19*n + c - s - q + 15) % 30;
    		final int b = u / 4;
    		final int d = u % 4;
    		final int L = (32 + 2*t + 2*b - e - d) % 7;
    		final int h = (n + 11*e + 22* L) / 451;
     
    		final int dividende = (e + L - 7*h + 114);
    		final int month = dividende / 31;
    		final int date = dividende % 31;
     
    		Calendar cal = Calendar.getInstance();
    		cal.clear();
    		cal.set(year, month-1, date+1, 12, 00);
    		return cal.getTime();
    	}



    a++
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

###raw>template_hook.ano_emploi###