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

Programmation et administration système Perl Discussion :

différence entre deux date (perl sous unix)


Sujet :

Programmation et administration système Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 109
    Points : 68
    Points
    68
    Par défaut différence entre deux date (perl sous unix)
    Bonjour,

    J'ai actuellement un programme écrit en Perl qui prend en entrée un nombre négatif ou positif et qui me renvoie une date qui correspond à la date système + ou - le paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #!/usr/bin/perl
    use strict;
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time()+(3600*24*$ARGV[0]));
    printf("%02d/%02d/%02d\n",$mday,$mon+1,$year-100);
    Ma question est la suivante : au lieu de prendre la date système, j'aimerai ajouter un deuxième paramètre au programme correspondant à une date.
    Je n'arrive cependant pas à trouver une fonction me permettant de transformer une chaine de caractère en objet time qui sera accepté par la fonction localtime.

    Pouvez vous m'aider ?

    Merci par avance

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Il faut parser la string puis utiliser timelocal() du module Time::Local (présent dans le CORE), mais une meilleure solution serait de regarder du côté du CPAN, par exemple DateTime propose un ensemble de module de parsing de date, qui accepte plus ou moins tous les formats.

    --
    Jedaï

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 109
    Points : 68
    Points
    68
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    A priori je n'ai pas accès au CPAN, il ne me trouve pas les éléments qu'il faut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Can't locate DateTime.pm in @INC (@INC contains: /usr/opt/perl5/lib/5.8.2/aix-thread-multi /usr/opt/perl5/lib/5.8.2 /usr/opt/perl5/lib/site_perl/5.8.2/aix-thread-multi /usr/opt/perl5/lib/site_perl/5.8.2 /usr/opt/perl5/lib/site_perl .) at calculdate2.pl line 4.
    Ensuite j'ai essayé d'utiliser timelocal mais ca n'a pas l'air de bien marché:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    if ( $ARGV[1] != "" ) {
       @date = split('/',$ARGV[1]);
       $time = timelocal(0,0,0,$date[0],$date[1],$date[2]);
       my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time+(86400*$ARGV[0]));
       printf("%02d/%02d/%02d\n",$mday,$mon,$year-100);
    }
    else{
       $time = time();
       my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time+(86400*$ARGV[0]));
       printf("%02d/%02d/%02d\n",$mday,$mon+1,$year-100);
    }
    calculdate2.pl +3 27/02/08 --> il me trouve 30/02/08

    D'ailleurs je ne comprends pas bien ce que $mon+1 et $year-100 vient faire dans le code d'origine.

    Comment puis je résoudre ce problème?

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    A priori je n'ai pas accès au CPAN, il ne me trouve pas les éléments qu'il faut :
    Can't locate DateTime.pm in @INC (@INC contains: /usr/opt/perl5/lib/5.8.2/aix-thread-multi /usr/opt/perl5/lib/5.8.2 /usr/opt/perl5/lib/site_perl/5.8.2/aix-thread-multi /usr/opt/perl5/lib/site_perl/5.8.2 /usr/opt/perl5/lib/site_perl .) at calculdate2.pl line 4.
    Ce message te dit simplement que tu n'as pas installé le module DateTime.pm .
    Tu dois dans un premier temps le télécharger sur le CPAN, ton script ne le fera pas pour toi .

    http://perl.developpez.com/faq/?page=sectionC32
    -- Jasmine --

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Ce message te dit simplement que tu n'as pas installé le module DateTime.pm .
    Tu dois dans un premier temps le télécharger sur le CPAN, ton script ne le fera pas pour toi .
    Surtout ne l'installe pas à la main : ce module a un grand nombre de dépendances.

    localtime() génère un numéro de mois commençant à 0 (d'où le $mon + 1), et timelocal() prend le même format que localtime(), du coup tes dates sont correctes (le 02 devrait être 03).

    --
    Jedaï

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 109
    Points : 68
    Points
    68
    Par défaut
    Il y a quelque chose que je ne comprends pas :

    si je laisse month+1, 27/02/08 + 3j doit me donner 01/03/08 et non 30/03/08... où est l'erreur?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 109
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Ce message te dit simplement que tu n'as pas installé le module DateTime.pm .
    Tu dois dans un premier temps le télécharger sur le CPAN, ton script ne le fera pas pour toi .

    http://perl.developpez.com/faq/?page=sectionC32
    donc je ne peux pas utiliser cette librairie: je n'ai pas la main sur ce qui est installé ou non sur ce serveur.

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par falcon Voir le message
    Il y a quelque chose que je ne comprends pas :

    si je laisse month+1, 27/02/08 + 3j doit me donner 01/03/08 et non 30/03/08... où est l'erreur?
    Je te rappelle que timelocal prend le même format d'entrée que la sortie de localtime...

    --
    Jedaï

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 109
    Points : 68
    Points
    68
    Par défaut
    désolé mais je ne comprend toujours pas ce que tu veux me dire...

  10. #10
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Cela signifie que la fonction localtime renvoie des valeurs sous un certain format et que timelocal prend en entrée le même format.

    localtime() génère un numéro de mois commençant à 0 (d'où le $mon + 1), et timelocal() prend le même format que localtime()
    27/02/08 + 3j doit me donner 01/03/08 et non 30/03/08... où est l'erreur?
    02 : mois de mars => 31 jours.



    Revoie la documentation associées à ces deux fonctions
    http://perldoc.perl.org/functions/localtime.html
    http://perldoc.perl.org/Time/Local.html
    -- Jasmine --

  11. #11
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Si tu lui donnes un numéro de mois égal à 2, il pense qu'il est en Mars... alors que tu voudrais qu'il pense être en Février, la solution correcte est :
    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
    #!/usr/bin/perl
    use strict; use warnings;
    use Time::Local qw(timelocal);
    use POSIX qw(strftime);
     
    my $time;
    if ( @ARGV == 2 ) {
      my ($day, $mon, $year) = split '/', $ARGV[1];
      $time = timelocal(0, 0, 0, $day, $mon - 1, $year - 1900);
    }
    else {
      $time = time();
    }
     
    print strftime("%d/%m/%Y\n", localtime($time+(24*3600*$ARGV[0])) );
     
    __END__
    (Cette version prend et renvoie des dates avec une année complète, on est au début du vingt-et-unième siècle, ce n'est pas une bonne idée d'utiliser deux digits)


    --
    Jedaï

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 109
    Points : 68
    Points
    68
    Par défaut
    ok !!! Quand tu parlais du "format" de la méthode, je pensai à la syntaxe, aux nombres d'arguments mais pas à la codification des mois et années

    merci beaucoup

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/07/2006, 14h04
  2. Nombre de minutes de différence entre deux dates
    Par Oberown dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 05/05/2006, 15h41
  3. Différence entre deux dates
    Par Azharis dans le forum Access
    Réponses: 3
    Dernier message: 11/01/2006, 10h58
  4. Différence entre deux dates
    Par pittzz dans le forum Oracle
    Réponses: 5
    Dernier message: 18/07/2005, 12h24
  5. Comment obtenir la différence entre deux dates ?
    Par jbat dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2005, 09h34

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