Comparer 2 dates

Résolu
lefreeman63 Messages postés 139 Statut Membre -  
ryko1820 Messages postés 1633 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
  3. ryko1820 Messages postés 1633 Date d'inscription   Statut Membre Dernière intervention   310
     
    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
    1. ryko1820 Messages postés 1633 Date d'inscription   Statut Membre Dernière intervention   310
       
      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
      0
  4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lefreeman63 Messages postés 139 Statut Membre
     
    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
    0
  7. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    $ 
    
    0
  8. lefreeman63 Messages postés 139 Statut Membre
     
    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]


    :-/
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      le date -d .. est juste pour comparer le résultat de Perl
      0
  9. lefreeman63 Messages postés 139 Statut Membre
     
    oui sa fonctionne :
    # perl -e 'use Time::Local; print timelocal(39, 31, 10, 15, 6, 2013), "\n";'
    1373877099
    
    0
  10. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    il faut convertir Mon Jul 15 10:31:39 en nombres, quel shell ?
    0
  11. ryko1820 Messages postés 1633 Date d'inscription   Statut Membre Dernière intervention   310
     
    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 ...
    0
  12. lefreeman63 Messages postés 139 Statut Membre
     
    ksh

    Vraiment merci bien :-)
    0
  13. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    un vieux ksh, je suppose
    $ ksh --version
      version         sh (AT&T Research) 93t+ 2009-05-01
    $ 
    
    0
  14. lefreeman63 Messages postés 139 Statut Membre
     
    lol surement très vieux étant donné que le version ne marche pas :-/

    # ksh --version
    ksh --version
    --version: bad option(s)
    
    
    0
  15. lefreeman63 Messages postés 139 Statut Membre
     
    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
    #
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      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\";"
      
      0
    2. lefreeman63 Messages postés 139 Statut Membre
       
      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
      0
  16. lefreeman63 Messages postés 139 Statut Membre
     
    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
    #
    0
    1. ryko1820 Messages postés 1633 Date d'inscription   Statut Membre Dernière intervention   310
       
      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
      0
    2. blux Messages postés 2051 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      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...
      0
    3. lefreeman63 Messages postés 139 Statut Membre
       
      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
      #
      
      0
    4. lefreeman63 Messages postés 139 Statut Membre
       
      Merci beaucoup Ryko pour ton aide et pour tous ces beau liens :-)
      0
    5. ryko1820 Messages postés 1633 Date d'inscription   Statut Membre Dernière intervention   310
       
      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
      0
  17. jisisv Messages postés 3678 Statut Modérateur 936
     
    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 :(
    0
    1. ryko1820 Messages postés 1633 Date d'inscription   Statut Membre Dernière intervention   310
       
      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
      0