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

Langage Perl Discussion :

Ajouter ou supprimer n mois à la date courante


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 51
    Points : 28
    Points
    28
    Par défaut Ajouter ou supprimer n mois à la date courante
    Bonjour,

    dans un script shell je souhaiterai réaliser une fonction perl ou shell qui me permette de rajouter ou d'enlever n mois à la date courante en ayant n en paramètre.

    je ne maitrise pas du tout Perl et je ne sais pas si ça serai plus simple qu'en Shell.

    Par exemple , aujourd'hui nous sommes le 20071106. je souhaite enlever 6 mois à la date nous serions le 20070506.


    Comment le faire d'une manière simple en appelant Perl dans mon script unix?


    Merci d'avance

  2. #2
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Pourquoi ne pas le faire en shell unix directement ?

    résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Wed May  7 10:14:03 CEST 2008
    ou avec une variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #!/bin/ksh
    n=3
    newdate=`date -d "+${n} month"`
    echo "${newdate}"

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 51
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par MarneusCalgarXP Voir le message
    Pourquoi ne pas le faire en shell unix directement ?

    résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Wed May  7 10:14:03 CEST 2008
    ou avec une variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #!/bin/ksh
    n=3
    newdate=`date -d "+${n} month"`
    echo "${newdate}"

    J'aurais bien aimé pouvoie utilisé cette solution mais le date de mon ksh n'a pas l'option -d. donc je ne peux pas l'utiliser.

    Avez vous une autre solution?

    Merci d'avance

  4. #4
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    etrange, sur quel OS tourne ton script ? (sinon on peut le faire en perl, mais autant rester tout en shell ^^)

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 51
    Points : 28
    Points
    28
    Par défaut
    ma version est :
    SunOS 5.8 Generic_117350-43 sun4u sparc SUNW,Sun-Fire-V440

    et surtout la version de la fonction date est trés vieille.

    Donc si vous pouviez me trouver la solution en perl ça serait trés bien.

    je sais que sur d'autres KSH votre solution marche mais pas la et je n'ai pas la possibilité de prendre une version plus récente.


  6. #6
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    alors le voici

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Time::Local 'timelocal_nocheck';
     
    ### Lecture paramètres
    my $months = shift(@ARGV) or die("usage : $0 <+/-MONTH>\n");
     
    ### récupération date courante
    my (undef, undef, undef, $day, $month, $year) = localtime();
     
    ### reconstruction date voulue (en ajoutant les mois passés en paramètre)
    my $timestamp = timelocal_nocheck(0, 0, 0, $day, $month + $months, $year);
     
    ### on récupère les composants de la date voulue
    (undef, undef, undef, $day, $month, $year) = localtime($timestamp);
    $year += 1900; # l'année retournée par localtime est relative à l'année 1900
    $month += 1; # le mois est dans l'intervalle 0..11. pour l'affichage, nous souhaitons 1..12
     
    ### on l'affiche au format souhaité
    printf("%04d%02d%02d", ($year, $month, $day));
    utilisation : "date.pl +3" ou "date.pl -3"

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  7. #7
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Je viens de me rendre compte d'un bug dans timelocal_nocheck (l'année ne s'incrémente pas), donc voici une version plus rustique mais qui a le mérite d'être opérationnelle

    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
     
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    ### Lecture paramètres
    my $months = shift(@ARGV) or die("usage : $0 <+/-MONTH>\n");
     
    ### récupération date courante
    my (undef, undef, undef, $day, $month, $year) = localtime();
     
    ### on ajoute le mois
    $month += $months;
    $month += 1; # le mois est dans l'intervalle 0..11. pour l'affichage, nous souhaitons 1..12
    $year += 1900; # l'année retournée par localtime est relative à l'année 1900
     
    # on effectue les opérations nécessaires pour remettre la date dans le bon intervalle
    while ($month > 12) { 
    	$year ++;
    	$month -= 12;
    }
     
    while ($month < 1) {
    	$year--;
    	$month += 12;
    }
     
    # on affiche la date finale
    printf("%04d%02d%02d", ($year, $month, $day));

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  8. #8
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 51
    Points : 28
    Points
    28
    Par défaut
    Bonjour,
    Merci de la réponse mais le programme ne marche pas :

    Si j'enlève 12 mois avec le programme j'obtiens :
    date aujourd'hui : 20071108
    résultat de date.pl -12 : 20071108

    Et si je rajoute 5 mois :
    date aujourd'hui : 20071108
    résultat de date.pl +5 : 20070408

    Il ne gère pas l'année en fait.

    je ne connais rien en Perl pour corriger cela si quelqu'una une idée.

    Merci d'avance


  9. #9
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 51
    Points : 28
    Points
    28
    Par défaut
    Paardon je n'avais pas vu le correctif........

    J'avais pas rafraichi la page le bougre.....

    Merci pour ton correctif.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 51
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par MarneusCalgarXP Voir le message
    Je viens de me rendre compte d'un bug dans timelocal_nocheck (l'année ne s'incrémente pas), donc voici une version plus rustique mais qui a le mérite d'être opérationnelle

    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
     
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    ### Lecture paramètres
    my $months = shift(@ARGV) or die("usage : $0 <+/-MONTH>\n");
     
    ### récupération date courante
    my (undef, undef, undef, $day, $month, $year) = localtime();
     
    ### on ajoute le mois
    $month += $months;
    $month += 1; # le mois est dans l'intervalle 0..11. pour l'affichage, nous souhaitons 1..12
    $year += 1900; # l'année retournée par localtime est relative à l'année 1900
     
    # on effectue les opérations nécessaires pour remettre la date dans le bon intervalle
    while ($month > 12) { 
    	$year ++;
    	$month -= 12;
    }
     
    while ($month < 1) {
    	$year--;
    	$month += 12;
    }
     
    # on affiche la date finale
    printf("%04d%02d%02d", ($year, $month, $day));
    Merci à toi.
    La réponse marche trés bien.

  11. #11
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    n'oublie pas de cliquer sur

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  12. #12
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    N'oubiez pas de regarder la FAQ pour la gestion des dates, il y a des exemples de scripts dans la section astuces et divers

Discussions similaires

  1. [AC-2010] Ajouter une durée en mois à une date.
    Par Darkangel2014 dans le forum Access
    Réponses: 7
    Dernier message: 06/10/2014, 14h00
  2. [V6] Ajouter des années, des mois à une date
    Par gwena2b dans le forum Deski
    Réponses: 3
    Dernier message: 27/06/2012, 15h06
  3. enlever un mois à la date courante
    Par titan_33 dans le forum Unix
    Réponses: 6
    Dernier message: 16/06/2010, 15h10
  4. ajouter un nombre de mois à une date
    Par PAYASS59 dans le forum Webi
    Réponses: 11
    Dernier message: 18/03/2010, 15h33
  5. ajouter un nombre de mois à une date
    Par mèmaton dans le forum WinDev
    Réponses: 7
    Dernier message: 22/04/2009, 11h30

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