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:
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.
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.
-
Contributeurest-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
-
Contributeurj'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\";" -
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/ -
ContributeurSalut,
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.
-
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 faireMon Jul 15 10:31:39
-
Contributeurhello
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 $ -
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]
:-/ -
oui sa fonctionne :
# perl -e 'use Time::Local; print timelocal(39, 31, 10, 15, 6, 2013), "\n";' 1373877099
-
Contributeuril faut convertir Mon Jul 15 10:31:39 en nombres, quel shell ?
-
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 ... -
ksh
Vraiment merci bien :-) -
Contributeurun vieux ksh, je suppose
$ ksh --version version sh (AT&T Research) 93t+ 2009-05-01 $
-
lol surement très vieux étant donné que le version ne marche pas :-/
# ksh --version ksh --version --version: bad option(s)
-
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 #-
Contributeuravec 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\";" -
-
-
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
#-
-
-
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 #
-
-
-
-
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 :(