Comparer 2 dates

Résolu/Fermé
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016 - 15 juil. 2013 à 10:38
ryko1820 Messages postés 1645 Date d'inscription dimanche 28 avril 2013 Statut Membre Dernière intervention 15 août 2021 - 15 juil. 2013 à 19:17
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
15 juil. 2013 à 12:32
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
15 juil. 2013 à 15:49
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 1645 Date d'inscription dimanche 28 avril 2013 Statut Membre Dernière intervention 15 août 2021 276
Modifié par ryko1820 le 15/07/2013 à 16:11
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 1645 Date d'inscription dimanche 28 avril 2013 Statut Membre Dernière intervention 15 août 2021 276
15 juil. 2013 à 16:19
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
15 juil. 2013 à 10:50
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 mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
15 juil. 2013 à 11:00
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
15 juil. 2013 à 11:52
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 mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
15 juil. 2013 à 11:59
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
15 juil. 2013 à 12:12
le date -d .. est juste pour comparer le résultat de Perl
0
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
15 juil. 2013 à 13:59
oui sa fonctionne :
# perl -e 'use Time::Local; print timelocal(39, 31, 10, 15, 6, 2013), "\n";'
1373877099
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
15 juil. 2013 à 14:30
il faut convertir Mon Jul 15 10:31:39 en nombres, quel shell ?
0
ryko1820 Messages postés 1645 Date d'inscription dimanche 28 avril 2013 Statut Membre Dernière intervention 15 août 2021 276
15 juil. 2013 à 14:32
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 mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
15 juil. 2013 à 14:37
ksh

Vraiment merci bien :-)
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
15 juil. 2013 à 15:19
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 mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
15 juil. 2013 à 15:46
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 mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
15 juil. 2013 à 16:02
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
15 juil. 2013 à 16:22
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 mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
15 juil. 2013 à 16:33
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 mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
15 juil. 2013 à 16:20
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 1645 Date d'inscription dimanche 28 avril 2013 Statut Membre Dernière intervention 15 août 2021 276
Modifié par ryko1820 le 15/07/2013 à 16:30
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 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
Modifié par blux le 15/07/2013 à 16:35
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 mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
15 juil. 2013 à 16:30
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 mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
15 juil. 2013 à 16:37
Merci beaucoup Ryko pour ton aide et pour tous ces beau liens :-)
0
ryko1820 Messages postés 1645 Date d'inscription dimanche 28 avril 2013 Statut Membre Dernière intervention 15 août 2021 276
Modifié par ryko1820 le 15/07/2013 à 17:10
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 dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
15 juil. 2013 à 17:57
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 1645 Date d'inscription dimanche 28 avril 2013 Statut Membre Dernière intervention 15 août 2021 276
Modifié par ryko1820 le 15/07/2013 à 19:19
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