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. 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
  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. 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
  4. 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
  5. 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. lol surement très vieux étant donné que le version ne marche pas :-/

      # ksh --version
      ksh --version
      --version: bad option(s)
      
      
      1. Contributeur
        un vieux ksh, je suppose
        $ ksh --version
          version         sh (AT&T Research) 93t+ 2009-05-01
        $ 
        
        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
            il faut convertir Mon Jul 15 10:31:39 en nombres, quel shell ?
            1. oui sa fonctionne :
              # perl -e 'use Time::Local; print timelocal(39, 31, 10, 15, 6, 2013), "\n";'
              1373877099
              
              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. 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. 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. 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
                      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.