Comparer 2 dates

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

dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
ryko1820 Messages postés 1677 Date d'inscription   Statut Membre Dernière intervention   276
 
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
ryko1820 Messages postés 1677 Date d'inscription   Statut Membre Dernière intervention   276
 
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

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

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

# ksh --version
ksh --version
--version: bad option(s)

0
lefreeman63 Messages postés 136 Date d'inscription   Statut Membre Dernière intervention  
 
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
lefreeman63 Messages postés 136 Date d'inscription   Statut Membre Dernière intervention  
 
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
lefreeman63 Messages postés 136 Date d'inscription   Statut Membre Dernière intervention  
 
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
ryko1820 Messages postés 1677 Date d'inscription   Statut Membre Dernière intervention   276
 
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
blux Messages postés 27127 Date d'inscription   Statut Modérateur Dernière intervention   3 361
 
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
lefreeman63 Messages postés 136 Date d'inscription   Statut Membre Dernière intervention  
 
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
lefreeman63 Messages postés 136 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup Ryko pour ton aide et pour tous ces beau liens :-)
0
ryko1820 Messages postés 1677 Date d'inscription   Statut Membre Dernière intervention   276
 
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
jisisv Messages postés 3645 Date d'inscription   Statut Modérateur Dernière intervention   934
 
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
ryko1820 Messages postés 1677 Date d'inscription   Statut Membre Dernière intervention   276
 
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