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 :

Gestion de la date en PERL


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Par défaut Gestion de la date en PERL
    Bonjour,

    Je n'arrive pas à manipuler mes dates correctement. Voici un exemple bien plus explicite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $date_heure = "2015-10-01 15:40:00";
    print $date_heure."\n";
    $date_heure = strftime("%Y-%M-%d %H:%M:%S", gmtime($date_heure - 7*86400));
    print $date_heure."\n";
    Dans cet exemple, qui ne marche pas, je voudrais obtenir la même heure exactement une semaine avant càd 2015-09-24 15:40:00

    Cependant je n'ai rien trouvé sur le net qui me permette de résoudre ce problème !

    Merci d'avance.

  2. #2
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    tu mélanges le format des différentes fonctions, mais sinon c'est une façon correcte de faire

    date_heure est une chaîne de caractères, mais tu l'utilises comme nombre quand tu fais la soustraction, ce qui donne un résultat bizarre

    il te faut la retransformer en nombre avant une telle opération

    il existe plusieurs façons de faire, explore les modules Date

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Par défaut
    Merci pour ta réponse, je vais me pencher sur les différentes fonctions et je reviendrais si besoin est.

    Je ne reviens cependant que dans 2 semaines.

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Cette partie est fausse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gmtime($date_heure - 7*86400)
    Pour que ça marche, il faut convertir $data_heure en une timestamp (un entier représentant le nombre de secondes écoulés depuis l'"époque" soit le 01-01-1970).

    Voici un exemple sous le débogueur Perl:
    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
     
      DB<1>  use Time::Local;
     
      DB<2> $date_heure = "2015-10-01 15:40:00";
     
      DB<3>  ($y, $m, $d, $h, $min, $s) = split /[ :-]/,  $date_heure; # un smiley dans une regex, c'est la classe, non?
     
      DB<4> x  ($y, $m, $d, $h, $min, $s)
    0  2015
    1  10
    2  01
    3  15
    4  40
    5  00
      DB<5> $m--; # mois numérotés à partir de 0, il faut retirer un
     
      DB<6> $timestamp = timegm($s, $min, $h, $d, $m, $y);
     
      DB<7> $prev_timestamp = $timestamp - 7 * 24 * 60 * 60;
     
      DB<8> print scalar  gmtime $timestamp;
    Thu Oct  1 15:40:00 2015
      DB<9> print scalar  gmtime  $prev_timestamp;
    Thu Sep 24 15:40:00 2015
    Il te suffit de reformater gmtime $prev_timestamp selon tes besoins, avec strftime ou autrement.

    Bon, c'était pour montrer comment faire avec ta méthode (soustraction du nombre de secondes écoulés en 7 jours), mais il existe des tas de modules pour gérer les calculs à ta place, le seul problème étant de trouver celui qui correspond le mieux à tes besoins.

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Par défaut
    Bonjour, me voilà de retour.

    Tout d'abord merci pour vos réponses.
    Je vais me pencher sur les différents modules et voir si certains correspondent plus à mes besoins que d'autres.

    Mon but étant de retrouver exactement la même syntaxe qu'au début ("2015-10-01 15:40:00").

    Je vous tiens au courant de l'avancée de mes recherches.

    timegm ne marche pas. Undefined subroutine. Ma version de perl est en 5.8.8 et sur cpan il me dit de télécharger la version 5.8.0 est ce normal ?

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Par défaut
    J'ai bien avancé, j'arrive à faire plus ou moins ce que je veux avec le code ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $date_heure = "2015-10-01 15:40:00";
    print $date_heure."\n";
    my ($y, $m, $d, $h, $min, $s) = split /[ :-]/,  $date_heure;
    print "avant = ".$y,$m,$d,$h,$min,$s."\n";
    ($y, $m, $d) = Add_Delta_Days($y, $m, $d, -7);
    print "apres = ".$y, $m, $d, $h, $min, $s."\n";
    Cependant un problème persiste. Dans mon exemple, quand on enlève 7 jours au premier octobre on tombe le 24 septembre. Jusque la tout va bien sauf que $m vaut 9 et pas 09 ce qui est un peu embêtant pour reformer ma chaîne de caractères.

    Avez vous une idée autre que de tester si $m < 10 et si oui ajouter un 0 devant ?

    [EDIT] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $date_heure = "2015-10-10 15:40:00";
    print $date_heure."\n";
    my ($y, $m, $d, $h, $min, $s) = split /[ :-]/,  $date_heure;
    print "avant = ".$y,$m,$d,$h,$min,$s."\n";
    ($y, $m, $d) = Add_Delta_Days($y, $m, $d, -7);
    print "apres = ".$y, $m, $d, $h, $min, $s."\n";
    if ($m < 10) {
      $m = "0".$m;
    }
    print " y = ".$y.", m = ".$m.", d = ".$d.", h = ".$h.", mn = ".$min.", s = ".$s."\n";
    my $mytime = $y.$m.$d.$h.$min.$s;
    print "mytime = ".$mytime."\n";
    $date_heure = strftime("%Y-%m-%d %H:%M:%S",$s,$min,$h,$d,$m,$y);
    print $date_heure."\n";
    Affichage :
    3915-11-03 15:40:00
    Je ne comprends pas le 3915 et le 11 !!!
    $y = 2015
    et
    $m = 10
    Je galère un peu pour le strftime aussi, j'ai plutôt du mal à voir comment fournir les variables calculées préalablement pour réunifier la date !

    [EDIT2] :
    The month (mon), weekday (wday), and yearday (yday) begin at zero, i.e., January is 0, not 1; Sunday is 0, not 1; January 1st is 0, not 1. The year (year) is given in years since 1900, i.e., the year 1995 is 95; the year 2001 is 101. Consult your system's strftime() manpage for details about these and the other arguments.
    Tout est là. Idem que pour le $m y'a pas un moyen moins dégueulasse que de traiter le tout avec un if et de modifier la variable suivant les besoins ?

    [EDIT3] : Code qui marche mais qui est p-e un peu sale
    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
    $date_heure = "2015-10-10 15:40:00";
    print $date_heure."\n";
    my ($y, $m, $d, $h, $min, $s) = split /[ :-]/,  $date_heure;
    print "avant = ".$y,$m,$d,$h,$min,$s."\n";
    ($y, $m, $d) = Add_Delta_Days($y, $m, $d, -7);
    print "apres = ".$y, $m, $d, $h, $min, $s."\n";
    $m = $m - 1;
    if ($m < 10) {
      $m = "0".$m;
    }
    $y = $y%1900;
    print " y = ".$y.", m = ".$m.", d = ".$d.", h = ".$h.", mn = ".$min.", s = ".$s."\n";
    my $mytime = $y.$m.$d.$h.$min.$s;
    print "mytime = ".$mytime."\n";
    $date_heure = strftime("%Y-%m-%d %H:%M:%S",$s,$min,$h,$d,$m,$y);
    print $date_heure."\n";
    Merci d'avance.

  7. #7
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ciols Voir le message

    timegm ne marche pas. Undefined subroutine. Ma version de perl est en 5.8.8 et sur cpan il me dit de télécharger la version 5.8.0 est ce normal ?
    La fonction timegm marchera si tu prends la peine, comme je l'avais fait dans l'exemple, d'ajouter cette ligne au début du script:

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

Discussions similaires

  1. Gestion des forfaits / dates / clients
    Par 973thom dans le forum Modélisation
    Réponses: 2
    Dernier message: 30/05/2007, 13h18
  2. format date en perl
    Par superdip dans le forum Modules
    Réponses: 10
    Dernier message: 20/04/2007, 14h20
  3. Manipulation de DATES en PERL / TALEND
    Par missjustme dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 18/04/2007, 18h15
  4. Réponses: 6
    Dernier message: 12/07/2006, 12h54
  5. cherche gestion de contenu CMS avec perl
    Par binge dans le forum Langage
    Réponses: 3
    Dernier message: 02/01/2006, 16h37

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