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 :

Delta temps en POSIX


Sujet :

Programmation et administration système Perl

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut Delta temps en POSIX
    Bonjour,

    Toujours dans mes histoire de date en PERL

    J'aimerais calculer un delta temps en POSIX. L'idée est de savoir combien on utilise un programme en ayant ses date de départ dans un fichier que j'ai appelé lmstat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
        user host localhost:42.0 (v2008.09) (host/29060 239), start Fri 1/21 16:53
     
     
        user host localhost:42.0 (v2008.09) (host/29060 239), start Fri 1/21 16:53
    Ensuite je lui soumet le script suivant :
    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
    44
     
    #!/usr/bin/perl
    use warnings;
    use strict;
    use POSIX qw(mktime strftime);
     
    (my $sec,my $min,my $hour,my $mday,my $mon,my $year,my $wday,my $yday,my $isdst) =localtime(time);
    $year += 1900;
     
    open(LMSTAT, "lmstat") || die "Impossible d'ouvrir : $!";
    my @feat=<LMSTAT>;
    close (LMSTAT);
     
    foreach my $check  (@feat) {
            if ($check =~ /start/) { 
                    my @check=split (/ /,$check);
                    print "$check \n";
                    print "$check[4] \n";
                    my $time_start=$check[13];
                    my $date_start=$check[12];
                    print "FLAG Hour_start :  $time_start\n";
                    print "FLAG Date_start :  $date_start\n";
     
                    (my $hour_start, my $min_start) = split/:/,$time_start;
                            $hour_start=~ s/^0//;
                            $min_start=~ s/^0//;
                    print "FLAG hour_start : $hour_start \n";
                    print "FlAG min_start : $min_start \n";
                    (my $mon_start, my $day_start) = split/\//,$date_start;
                    print "FLAG mon_start:  $mon_start\n";
                    print "FLAG day_start :  $day_start\n";
     
                    my $local_time= mktime (0, $min, $hour, $mday, $mon, $year);
                    print "FLAG local_time : $local_time \n";
                    my $start_time = mktime(0, $min_start, $hour_start, $day_start, $mon_start, $year);
                    print "FLAG use_time : $start_time\n";
    #Delta time :
                    my $used_time=$start_time - $local_time ;
                    print "Flag used_time : $used_time \n";
     
                    my $readable_time = localtime($used_time);
                    print " $readable_time \n";
                            }
                    }
    Mon problème c'est que je n'arrive pas à avoir un résultat en heure minutes seconde. Je n'arrive qu'a avoir des dates .....
    Est ce possible avec POSIX ? Sinon je dois installer CPAN du style Date::Time

    Merci de votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    use POSIX qw(strftime);
    Pour la doc de strftime, voir le manuel de la fonction C.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Merci Philou,


    Je n'arrive pas à me servir de cette fonction qui m'à l'air bien pratique ....
    J'ai ajouté ceci au script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $readable_time = strftime "%j %H:%M", $used_time;
    		print " $readable_time \n";
    Et j'ai le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at ./Monitor_dcompiler.pl line 51.
    Apparemment, ce n'est pas bien formaté.

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    En fait, je ne comprends pas vraiment, car $used_time ne semble pas être une date/heure, mais une durée... convertir l'affichage en jour/heure/minute ne peut donc (en théorie) se faire avec des fonctions sur les dates, mais sur les durées.

    Il existe alors pour cela, plusieurs modules :
    - Time::Duration::fr
    - DateTime::Format::Human::Duration
    - ...

    Une façon facile de le faire à la main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "%dj %02d:%02d:%02d", int($used_time / 86400), int(($used_time % 86400)/3600), int(($used_time % 3600)/60), int($used_time % 60);
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par Philou67430 Voir le message


    Une façon facile de le faire à la main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "%dj %02d:%02d:%02d", int($used_time / 86400), int(($used_time % 86400)/3600), int(($used_time % 3600)/60), int($used_time % 60);
    Merci Philou,
    Mon objectif est d'utiliser le moins de modules possibles.... Je travaille sur des machines SPARC et des fois je me retrouve en galère pour installer les dépendances....

    La dernière commande est un peut ce que je cherchais puisque la variable $used_time est une durée en seconde entre maintenant et la date du fichier lmstat, donc oui pour les avoir divisés pour obtenir des jours des heures etc... Je pensais que la fonction sfrtime le faisait....

    Maintenant quand j'applique le script J'ai un temps d'utilisation de 20jours, alors que la date relevée est du 21 janvier 2011... .Je cherche donc ou est l'erreur...

    Merci pour l'aide

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Et bien, entre le 1 janvier et le 21 janvier, il y a 20 jours
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Et bien, entre le 1 janvier et le 21 janvier, il y a 20 jours
    Désolé Je n'avais pas percuté

    En fait, je cherche pour faire le calcul entre le 21 janvier et maintenant..... Je devrais avoir 10 jours environ. Si j'inverse la soustraction j'aurai un nombre négatif .... Alors que la variable en seconde de la date actuel par rapport à 1970 devrait être plus grande que la variable en seconde de la date du 21 janvier (d'ou incompréension) ... Je pense que je n'ai pas bien configuré $local_time, si je met ce flag suivant dans le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print " Flag Local_Time :  $mday  $mon $year \n";
    qui le résultat de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (my $sec,my $min,my $hour,my $mday,my $mon,my $year,my $wday,my $yday,my $isdst) =localtime(time);
    $year += 1900;
    J'ai bien le premier janvier de cette année alors qu'il devrait prendre la date d'aujourd'hui

    Merci pour l'aide

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Ton erreur provient (au moins une) du fait que mktime accepte le mois en débutant à 0 (pour janvier).

    Sinon, j'ai simplifié ton code et voici quelque chose qui devrait faire ce que tu attends :

    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
    #!/usr/bin/perl
    use warnings;
    use strict;
    use POSIX qw(mktime strftime);
     
    sub duration_as_text {
      my ($duration) = @_;
     
      my $days    = int($duration / 86400);
      my $hours   = int(($duration % 86400)/3600);
      my $minutes = int(($duration % 3600)/60);
      my $seconds = int($duration % 60);
     
      return sprintf "%dj %02d:%02d:%02d", $days, $hours, $minutes, $seconds;
    }
     
    open(LMSTAT, "lmstat") || die "Impossible d'ouvrir : $!";
    my @feat=<LMSTAT>;
    close (LMSTAT);
     
    my (undef, undef, undef, undef, undef, $year) = localtime();
     
    foreach my $check  (@feat) {
      if (my ($date) = $check =~ /start\s*(.*)$/) {
        my (undef, $mon_start, $mday_start, $hour_start, $min_start) = split m{[\s/:]}, $date;
     
        print "FLAG hour_start : $hour_start \n";
        print "FlAG min_start :  $min_start \n";
        print "FLAG mon_start:   $mon_start\n";
        print "FLAG day_start :  $mday_start\n";
     
        my $start_time = mktime(0, $min_start, $hour_start, $mday_start, $mon_start-1, $year);
        print "FLAG start_time : $start_time \n";
        print "FLAG local_time : ".(time())." \n";
     
        # Delta time :
        my $used_time = time() - $start_time;
        print "Flag used_time : $used_time \n";
     
        print duration_as_text($used_time), "\n";
      }
    }
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Merci Philou,

    Arriverai-je à trouver par moi même un jours

    J'avais commencer à configurer ma date comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    my $current_date = `date +%M\\ %H\\ %d\\ %m\\ %y`;
    my @current_date =split (/ /,$current_date);
    my $min = $current_date[0];
    my $hour  = $current_date[1];
    my $mday  = $current_date[2];
    my $mon  = $current_date[3];
    my $year  = $current_date[4];
    Mais bon, je suis allé me jeter par dessus bord en voyant ta réponse
    Ceci dit je suis en train d'étudier ton code au peigne fin ....

    Encore Merci

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Bon à savoir :
    localtime() sans paramètre est équivalent à localtime(time()).
    mktime() retourne une date du même format que time() (nombre de secondes depuis l'EPOCH).
    Pour n'affecter que quelques éléments d'un tableau à un autre (par exemple, seulement le 2 et le 3e), il suffit d'affecter à undef :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (undef, $param2, $param3) = split /\s+/, $params;
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Pourquoi n'as tu pas réduis la fonction duration_as_text, en une seule ligne comme celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "Temps d'utilisation : %dj %02d:%02d:%02d \n\n\n", int($used_time / 86400), int(($used_time % 86400)/3600), int(($used_time % 3600)/60), int($used_time % 60);

  12. #12
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Pour qu'elle soit plus lisible, mais rien n'empêche bien sur de la remettre sur une ligne
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/11/2020, 18h51
  2. Accéléromètre sur un temps delta t
    Par Zarb1 dans le forum Android
    Réponses: 4
    Dernier message: 20/09/2013, 14h33

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