Comparer 2 dates

Résolu
Bonjour tous le monde.

Désolé de vous déranger surtout qu'il y a déjà un grand nombre de question ouvert sur la comparaison de date mais la je commence à sécher.

Je cherche en faite à comparer 2 date et à voir si il y a moins de 10 minutes entre les 2. Pour rentrer dans une boucle derrière.

le problème de mes date c'est qu'elles sont sous cette forme:

Mon Jul 15 10:31:39


Une de ces date sera généré avec la commande date et l'autre sera extraite d'une log.

Je suis sur un AIX.

Merci d'avance pour votre aide.

16 réponses

Résumé de la discussion

La discussion porte sur la comparaison de deux dates pour vérifier une différence inférieure à dix minutes, avec des dates au format Mon Jul 15 10:31:39 générées sur AIX. La solution recommandée utilise un script ksh93 nommé diffdate qui convertit chaque date en secondes depuis l'époque avec printf '%(%s)T', calcule la différence et l'exprime en heures et minutes. Exemple : diffdate Mon Jul 15 10:31:39 Sun Jul 15 11:00:39 donne 00 h 29 mn et montre le calcul de la différence. D'autres propositions évoquent Perl Time::Local et des solutions GNU date, mais l'adaptation dépend de la version d'AIX et des outils disponibles.

Bobot (l’IA à votre service)
  1. Contributeur
    est-ce que ceci fonctionne ? (Jul == 6, parce que les mois vont de 0 à 11)
    $ perl -e 'use Time::Local; print timelocal(39, 31, 10, 15, 6, 2013), "\n";'  
    1373877099
    1. Contributeur
      j'espère qu'il connait les tableaux associatifs
      $ ./k1
      1373877099
      $ 
      $ cat k1
      #!/bin/ksh
      date="Mon Jul 15 10:31:39 $(date +%Y)"
      mois=([Jan]=0 [Feb]=1 [Mar]=2 [Apr]=3 [May]=4 [Jun]=5 [Jul]=6 [Aug]=7 [Sep]=8 [Oct]=9 [Nov]=10 [Dec]=11)
      export IFS=" :" ;set -- $date
      perl -e "use Time::Local; print timelocal($6, $5, $4, $3, ${mois[$2]}, $7), \"\n\";"
      
      
      1. Hello,

        puissant le ksh ...

        j'ai trouvé un petit truc ...

        #
        # USAGE: diffdate start-date finish-date
        #
        # EXAMPLE: diffdate "Tue, Feb 19, 2008 08:00:02 PM" "Wed, Feb 20, 2008 02:19:09 AM"
        #
        # Note: Maximum de 100 heures de différence entre 2 dates ...
        # 
        
        SDATE=$(printf '%(%s)T' "$1")
        FDATE=$(printf '%(%s)T' "$2")
        
        DIFF=$(($FDATE-$SDATE))
        SECS=$(($DIFF % 60))
        MINS=$(($DIFF % (60 * 60) / 60))
        HOURS=$(($DIFF / (60 * 60)))
        printf "il y a %02d h %02d mn et %02d secondes de différence entre les 2 dates\n" $HOURS $MINS $SECS
        


        exemple :

        ./diffdate.ksh "Mon Jul 15 10:31:39" "Sun Jul 15 11:00:39"
        il y a 00 h 29 mn et 00 secondes de différence entre les 2 dates

        Ok, je l'ai pas inventé :p

        Source (en pdf): http://blog.fpmurphy.com/2008/10/ksh93-date-manipulation.html?output=pdf

        Quelques autres liens intéressant en rapport avec le sujet, rencontrés en cherchant :

        https://docstore.mik.ua/orelly/unix3/korn/ch07_02.htm
        https://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/
        1. Si c'est pas clair voir les liens joint, sur le formatage des dates en ksh

          On initialise par printf deux variables date (T) au format epoch (%s) a partir des arguments dates entrés ...
          On soustrait, on formate pour les secondes, etc ...
          Simple
      2. Contributeur
        Salut,

        Le plus simple reste de convertir tes dates en "epoch" (man date) et de voir si la différence est supérieure ou non à 600.
        1. Merci beaucoup pour ta réponse.

          Effectivement j'y avais pensé mais je dois t'avouer que je n'arrive pas à convertir la date de ma log en epoch :-/

          Pour la date courante ces date +%s

          Mais pour une date sous ce format je vois pas comment faire
          Mon Jul 15 10:31:39
          1. Contributeur
            hello
            essayer en Perl; j'ai rajouté l'année, mais je n'ai pas le bon fuseau horaire (3600s de diff), je cherche.
            $ perl -e 'use Time::Piece; my $t=Time::Piece->strptime($ARGV[0], "%a %b %d %T %Y"); print $t->strftime("%s\n")' "Mon Jul 15 10:31:39 2013" ; date -d 'Mon Jul 15 10:31:39 2013' +%s
            1373880699
            1373877099
            $ 
            
            1. Waou impressionnant la ligne, merci bien.

              Mais malheureusement je suis sous un AIX qui n'aime pas l'option -d

              Can't locate Time/Piece.pm in @INC (@INC contains: /usr/opt/perl5/lib/5.8.8/aix-thread-multi /usr/opt/perl5/lib/5.8.8 /usr/opt/perl5/lib/site_perl/5.8.8/aix-thread-multi /usr/opt/perl5/lib/site_perl/5.8.8 /usr/opt/perl5/lib/site_perl .) at -e line 1.
              BEGIN failed--compilation aborted at -e line 1.
              date: illegal option -- d
              Usage: date [-n][-u] [mmddHHMM[[cc]yy]] [+Field Descriptors]
              Usage: date [-n][-u] [mmddHHMM[.SS[cc]yy]] [+Field Descriptors]
              Usage: date [-a] [[+|-]sss.fff]


              :-/
              1. Contributeur
                le date -d .. est juste pour comparer le résultat de Perl
            2. oui sa fonctionne :
              # perl -e 'use Time::Local; print timelocal(39, 31, 10, 15, 6, 2013), "\n";'
              1373877099
              
              1. Contributeur
                il faut convertir Mon Jul 15 10:31:39 en nombres, quel shell ?
                1. Sympa AIX, je vais pas loin en vacance ;p

                  Nan je déconne .... ;-)

                  J'ai fait pas mal de RS6000 et on voit pas souvent des questions là dessus ici, mais Dubcheck a déjà donné une soluce qui tient la route ...
                  1. Contributeur
                    un vieux ksh, je suppose
                    $ ksh --version
                      version         sh (AT&T Research) 93t+ 2009-05-01
                    $ 
                    
                    1. lol surement très vieux étant donné que le version ne marche pas :-/

                      # ksh --version
                      ksh --version
                      --version: bad option(s)
                      
                      
                      1. Pkoi es ce que j'ai l'impression que j'ai pas de chance et qu'il ne connais pas les tableaux associatifs :-(

                        # cat test.ksh
                        #!/bin/ksh
                        date="Mon Jul 15 10:31:39 $(date +%Y)"
                        mois=([Jan]=0 [Feb]=1 [Mar]=2 [Apr]=3 [May]=4 [Jun]=5 [Jul]=6 [Aug]=7 [Sep]=8 [Oct]=9 [Nov]=10 [Dec]=11)
                        export IFS=" :" ;set -- $date
                        perl -e "use Time::Local; print timelocal($6, $5, $4, $3, ${mois[$2]}, $7), \"\n\";"
                        
                        # ./test.ksh
                        ./test.ksh[3]: syntax error at line 3 : '(' unexpected
                        #
                        1. Contributeur
                          avec un case, alors
                          #!/bin/ksh
                          date="Mon Jul 15 10:31:39 $(date +%Y)"
                          export IFS=" :" ;set -- $date
                          case $2 in
                                  Jan) m=0 ;;
                                  Feb) m=1 ;;
                                  Mar) m=2 ;;
                                  Apr) m=3 ;;
                                  May) m=4 ;;
                                  Jun) m=5 ;;
                                  Jul) m=6 ;;
                                  Aug) m=7 ;;
                                  Sep) m=8 ;;
                                  Oct) m=9 ;;
                                  Nov) m=10 ;;
                                  Dec) m=11 ;; 
                          esac
                          perl -e "use Time::Local; print timelocal($6, $5, $4, $3, $m, $7), \"\n\";"
                          
                        2. NIKEL :-D

                          Sa marche bien avec le case :-) plus qu' a réadapter pour mon script.

                          Sincèrement Merci beaucoup, je confirme que j'aurais jamais pu y arriver seul
                      2. Merci bien sa avait l'air très jolie mais mon serveur est à chier lol:

                        # cat test.ksh
                        #!/bin/ksh
                        #
                        # USAGE: diffdate start-date finish-date
                        #
                        # EXAMPLE: diffdate "Tue, Feb 19, 2008 08:00:02 PM" "Wed, Feb 20, 2008 02:19:09 AM"
                        #
                        # Note: Maximum de 100 heures de différence entre 2 dates ...
                        #

                        SDATE=$(printf '%(%s)T' "$1")
                        FDATE=$(printf '%(%s)T' "$2")

                        DIFF=$(($FDATE-$SDATE))
                        SECS=$(($DIFF % 60))
                        MINS=$(($DIFF % (60 * 60) / 60))
                        HOURS=$(($DIFF / (60 * 60)))
                        printf "il y a %02d h %02d mn et %02d secondes de différence entre les 2 dates\n" $HOURS $MINS $SECS

                        # ./test.ksh "Mon Jul 15 10:31:39" "Sun Jul 15 11:00:39"
                        ./test.ksh[13]: ()T-()T: syntax error
                        #
                        1. Tu peux essayer avec #!/usr/bin/ksh93 au début ou là ou pourrait se situer ksh93 ?

                          Apparemment sous linux par défaut on a de l'enhanced ksh pas sous AIX ...

                          http://pic.dhe.ibm.com/infocenter/aix/v6r1/index.jsp?topic=%2Fcom.ibm.aix.baseadmn%2Fdoc%2Fbaseadmndita%2Fkorn_shell_enhanced.htm
                        2. Modérateur
                          Salut,

                          Par défaut, sous AIX, c'est le ksh88...
                          Pour le savoir, taper une fois sur [ECHAP] puis [CTRL+V], ça affiche un truc du genre :
                          Version M-11/16/88f

                          Il faut avoir fait un set -o vi, avant...

                          Ensuite, un bon shebang pour /usr/bin/ksh93 devrait aller...
                        3. Y a du changement :-) :

                          # cat test.ksh
                          #!/usr/bin/ksh93
                          #
                          # USAGE: diffdate start-date finish-date
                          #
                          # EXAMPLE: diffdate "Tue, Feb 19, 2008 08:00:02 PM" "Wed, Feb 20, 2008 02:19:09 AM"
                          #
                          # Note: Maximum de 100 heures de différence entre 2 dates ...
                          #
                          
                          SDATE=$(printf '%(%s)T' "$1")
                          FDATE=$(printf '%(%s)T' "$2")
                          
                          DIFF=$(($FDATE-$SDATE))
                          SECS=$(($DIFF % 60))
                          MINS=$(($DIFF % (60 * 60) / 60))
                          HOURS=$(($DIFF / (60 * 60)))
                          printf "il y a %02d h %02d mn et %02d secondes de différence entre les 2 dates\n" $HOURS $MINS $SECS
                          
                          # ./test.ksh
                          ./test.ksh[10]: printf: T: unknown format specifier
                          ./test.ksh[11]: printf: T: unknown format specifier
                          ./test.ksh: line 13: -: more tokens expected
                          #
                          
                        4. Merci beaucoup Ryko pour ton aide et pour tous ces beau liens :-)
                        5. Bah de rien, malheureusement même le printf de ton ksh93 connait pas l'option T :'(
                          (et leur %s non plus veut pas dire la même chose)
                          Ils nous facilitent pas la vie ces gens là ...

                          http://pic.dhe.ibm.com/infocenter/aix/v6r1/index.jsp?topic=%2Fcom.ibm.aix.cmds%2Fdoc%2Faixcmds4%2Fprintf.htm
                      3. Modérateur
                        johand@osiris: ~ $ date "+%s" -d "Mon Jul 15 10:31:39"
                        1373877099
                        te donne le nombre de secondes depuis l'epoch .
                        avec GNU coreutils 8.12.197-032bb
                        Sous AIX , je ne sais pas :(
                        1. AMHA ça marchera pas non plus :'(

                          http://pic.dhe.ibm.com/infocenter/aix/v6r1/index.jsp?topic=%2Fcom.ibm.aix.cmds%2Fdoc%2Faixcmds2%2Fdate.htm

                          Il y a pas l'option display dans leur commande date et c'est bien dommage ...
                          Faut le faire en C ? :p