[Perl] Comparer deux dates

Bonjour,

Je suis un debutant en linux et en perl, merci d'etre compréhensif ^^ , j'ai deja lu pas mal de truc sur le sujet, enfin je remerci d'avance ceux qui pourront m'aider ^^

J'ai une date contenu dans une variable : avec ce type de format : $date1 = Sep 10 12:25:32 2010

J'aimerai la comparer avec la date actuel ($date2, que j'ai aussi dans une variable avec le meme format) , et que le script ecrive un message si le delai entre les deux date est inférieur ou égal à 2mois ($date1 - $date2 =< 2mois)

Je peu installer des packages, ou je sais pas comment sa s'appelle du genre Date::Time, d'apres ce que j'ai lu sur d'autre sujet ca pourrai etre utile.

A mon avis, c'est très simple pour qqun qui s'y connait, mais en tout cas pas pour moi ^^

Voila, merci ^^

24 réponses

Résumé de la discussion

Des débutants en Perl cherchent à comparer deux dates au format 'Sep 10 12:25:32 2010' et à afficher un message lorsque l’écart est inférieur ou égal à deux mois. Plusieurs développeurs recommandent d'utiliser Date::Manip et Date::Calc, par exemple ParseDate pour convertir les chaînes en dates et Delta_Days pour calculer l’écart en jours, ou en extraire le composant année/mois/jour. Par exemple, on peut parser les dates avec ParseDate, extraire les composants avec UnixDate et comparer via Delta_Days pour déterminer si l’écart respecte le seuil des deux mois. Des échanges évoquent aussi des alternatives avec Date::Manip produisant un objet Date::Manip, ainsi que des vérifications d’erreurs liées à des formats et à des versions différentes.

Bobot (l’IA à votre service)
  1. Ca marche !

    J'ai reinstaller Date::Manip, et ca a marcher ensuite, j'aurai du y penser avant malgré que je n'avais pourtant pas eu d'erreur lors de l'installation, enfin bref, un mystère de resolu.

    Après ça, ton code marche, le mien aussi et j'obtient bien le nombre de jours de difference entre les deux dates.

    Merci pour le temps que tu as consacré a ce problème !
    :)
    0
    1. Modérateur
      ecoute, je vais essayer de decouvrire, mais si c'est possible fait comme je l'ai fait dans mon message 23
      donc le fichier ainsi que l'exécution
      merci
      0
      1. Ce qui est bizarre c'est que dans le message d'erreur il y a la valeur attendu :

        date passed in ('2010091012:25:32') is not a Date::Manip object at test3.pl line 7

        Il faudrai juste cette valeur sans le message d'erreur en faite :O
        0
        1. Modérateur
          Bizarre,

          regarde ce que j'ai (j'ai installé la version 5.48
          lami20j@debserv:~/trash$ cat ccm.pl
          #!/usr/bin/perl
          use strict;use warnings;
          use Date::Manip;
          ##
          my $date1 = "Sep 10 12:25:32 2010";
          my $d1 = ParseDate($date1);
          print "$d1\n";
          __END__
          lami20j@debserv:~/trash$ perl -MDate::Manip -e 'print "$Date::Manip::VERSION\n"'
          5.48
          lami20j@debserv:~/trash$ perl ccm.pl
          2010091012:25:32
          lami20j@debserv:~/trash$

          0
          1. Merci !
            Tu es un peu mon cadeau de noel :D
            (k)
            0
            1. Modérateur
              J'ai la version 5.48, aparemment la derniere que j'ai telecharger sur le site CPAN

              bon, moi j'ai la version 5.44,

              je vais télécharger la version 5.48 pour tester chez moi
              0
              1. Je comprends pas ton code mais je l'ai executer en esperant que ca puisse aider a resoudre le probleme :D

                Ca m'affiche comme résultat :

                [admin@XXXX]$ perl test3.pl
                Sep 10 12:25:32 2010
                831011123249483249505850535851503250484948
                0
                1. Modérateur
                  Alors, affiche le résultat de
                  #!/usr/bin/perl
                  use strict;use warnings;
                  
                  my $dd;
                  my $d = "Sep 10 12:25:32 2010";
                  print "$d\n";
                  print $dd if ($dd =$d)=~s/(.)/ord($1)/eg;
                  print "\n";
                  mais que la source de récupération de ta variable ne change pas
                  0
                  1. Mon code n'es pas secret et je te l'ai afficher au dessus, je choppe $d1 avec la commande openssl, c'est en faite la date de fin d'un certificat.
                    J'ai la version 5.48, aparemment la derniere que j'ai telecharger sur le site CPAN

                    Je pense juste que l'erreur ne vient pas du code, sachant que chez toi ca marche et pas chez moi, ce que je comprend pas c'est pourquoi ?
                    0
                    1. Modérateur
                      affiche aussi
                      perl -MDate::Manip -e 'print "$Date::Manip::VERSION\n"'
                      pour voir si on a la même version de Date::Manip
                      0
                      1. Modérateur
                        Bon, je vois que tu veux tenir ton code secret.

                        Je teste ton code et il n'y a pas d'erreur

                        lami20j@debserv:~/trash$ cat ccm.pl
                        #!/usr/bin/perl
                        #
                        use strict;use warnings;
                        use Date::Manip;
                        #
                        my $date1 = "Sep 10 12:25:32 2010";
                        my $d1 = ParseDate($date1);
                        print "$d1\n";
                        lami20j@debserv:~/trash$ perl ccm.pl
                        2010091012:25:32
                        donc l'erreur viens peut être du traitement apprès Date::Manip
                        0
                        1. Et meme en essayant un code aussi simple que ca :

                          #!/usr/bin/perl
                          
                          use strict;use warnings;
                          use Date::Manip;
                          
                          my $date1 = "Sep 10 12:25:32 2010";
                          my $d1 = ParseDate($date1);


                          Il me met toujours la meme erreur :

                          date passed in ('2010091012:25:32') is not a Date::Manip object at test3.pl line 7

                          Pour bien te montrer que peut importe $date1, c'est le ParseDate qui pose problème
                          0
                          1. Le code que je t'ai mis au dessus, c'est la fonction de Manip.pm qu'il n'arrive pas realiser avec le ParseDate de ton code(et du mien), c'est peut etre pas utile, mais ca pourrai aider qqun a comprendre pourquoi il m'affiche cette erreur.

                            Sinon si tu veux mon script le voila :

                            #!/usr/bin/perl5.8.0
                            
                            use strict;use warnings;
                            use Date::Manip;
                            use Date::Calc qw(Delta_Days);
                            
                            my $date1 = `openssl x509 -in XXXX.crt -enddate -noout`;
                            $date1=~s/notAfter=//;
                            $date1=~s/GMT//;
                            
                            my $date2 = localtime(time);
                            $date2 =~s/Mon//;
                            $date2 =~s/Tue//;
                            $date2 =~s/Wed//;
                            $date2 =~s/Thu//;
                            $date2 =~s/Fri//;
                            $date2 =~s/Sat//;
                            $date2 =~s/Sun//;
                            
                            $date2 =~s/^[ \t]+//;
                            
                            my $d1 = ParseDate($date1);
                            my $d2 = ParseDate($date2);
                            
                            my ($a1,$m1,$j1,$H1,$M1,$S1) = UnixDate($d1,"%Y","%m","%d","%H","%M",&quot,"%S");
                            print "$a1,$m1,$j1,$H1,$M1,$S1";
                            print "\n";


                            Je n'ai pas continuer sachant qu'il m'affiche deja une erreur

                            Enfin le mien ou le tiens de code ca ne change rien, il met l'erreur dans les 2 au meme moment, celui du ParseDate

                            Et encore merci pour ta patience !
                            0
                            1. Modérateur
                              Ben, justement, ce que j'ai besoin c'est ton script, en fait la partie qui contient $date1

                              Et attention à ton test qui est fait sur Date_Split et pas sur Date::Manip
                              if (not Date_Split($date)) {
                              my $err = "date passed in ('$date') is not a Date::Manip object";


                              c'est quoi Date_Split?
                              affiche le script complet pas seulement la fonction.

                              0
                              1. Le script figure juste au dessus, c'est celui de lami20j,

                                la ligne 9 est donc =>

                                my $d1 = ParseDate($date1);


                                J'ai lu la doc de Date::Manip, et j'ai chercher dans le code de Manip.pm :
                                voila aparemment la fonction qu'il n'arrive pas a réaliser :

                                sub Date_ConvTZ {
                                  print "DEBUG: Date_ConvTZ\n"  if ($Curr{"Debug"} =~ /trace/);
                                  my($date,$from,$to,$level)=@_;
                                  if (not Date_Split($date)) {
                                    my $err = "date passed in ('$date') is not a Date::Manip object";
                                    if (! $level) {
                                      croak $err;
                                    } elsif ($level==1) {
                                      carp $err;
                                    }
                                    return "";
                                  }


                                Je l'ai chercher par rapport au message d'erreur et je n'ai aucune idée d'où ca peut venir.

                                Merci pour vos reponses
                                0
                                1. Salut,

                                  Et bien ecoute c'est ton code qui ne marche pas chez moi, (et le mien aussi par la meme occasion, et avec la meme erreur),

                                  J'ai copier coller ton code dans un fichier .pl, changer le ";" apres le quot par une virgule et j'ai rajouter un guillemet avant le %S pour eviter les erreur de syntaxe.

                                  Et quand je l'execute :

                                  date passed in ('2010091012:25:32') is not a Date::Manip object at test2.pl line 9

                                  Cela ne viendrai peut etre pas du code alors?

                                  Merci
                                  0
                                  1. Contributeur
                                    Je pense que tu devrais afficher la ligne contenant l'erreur, soit la ligne 9 de ton script. (met les lignes de 7 à 12 par exemple)

                                    Une erreur de guillemet peut causer bien des maux de têtes ;)
                                    0
                                2. Modérateur
                                  Salut,

                                  j'aimerais bien voir ton code, pas le mien qui fonctionne.
                                  si tu ne me donne plus de détails alors je ne peux rien pour toi.
                                  0
                                  1. Re,

                                    Et bien, avec ton code, j'ai la meme erreur, toujours au niveau du ParseDate,

                                    Meme avec la fonction que j'ai trouvé dans le manuel de Date::Manip => my $d3 = ParseDate("today");

                                    toujours pareil :

                                    date passed in ('2007121209:02:38') is not a Date::Manip object at test2.pl line 10

                                    Comment le declarer en Date::Manip object ?

                                    Merci pour vos reponses !
                                    0
                                    1. Modérateur
                                      Salut,

                                      En fait il n'avait pas des erreurs dans mon code ;-) sauf que je viens de remarquer que les guillements ont été traduite en code HTML
                                      Donc c'est la faute de CCM ;-DDDDDDDDDDDD

                                      Qqun aurait il une idée?
                                      Oui, si tu m'affiche ton script ;-)
                                      0
                                      1. Coucou, et merci pour vos reponse, j'ai essayer de comprendre ton code tout d'abord, il y avait qq erreur, que je pense avoir trouver

                                        (; apres quote a remplacer par une virgule et aussi la " avant %S), en tout cas je te remerci, j'ai aussi installer Date::Manip ainsi que Date::Calc

                                        Mais il me reste quelque erreur:

                                        [root@XXXXX]# perl test.pl
                                        Sep 5 12:59:36 2010 => ma $date1

                                        Dec 11 15:48:33 2007 => ma $date2
                                        date passed in ('2010090512:59:36') is not a Date::Manip object at test.pl line 27

                                        Aparemment la ligne 27 pose probleme au moment du ParseDate,

                                        Qqun aurait il une idée?

                                        Si vous avez besoin de plus de détails n'hesitez pas !
                                        Et encore merci lami20j !
                                        0
                                        • 1
                                        • 2