KSH mesure le temps écoulé

J’essaie de trouver la différence de jour entre la dernière fois qu’un mot de passe a été mis au repos. Donc, j’ai cela jusqu’à présent. J’essaie juste de convertir cette date en jours afin que je puisse soustraire la date actuelle en jours – la dernière date de réinitialisation en jours et obtenir un nombre entier.

$ LASTRESETDATE=$(echo $(passwd -s) | cut -d' ' -f3) $ echo $LASTRESETDATE 12/15/16 

En regardant la date verion je n’ai pas d’option pour -d

 $ date -h date: illegal option -- h Usage: date [-u] [+format] date [-u] [mmddhhmm[[cc]yy]] date [-a [-]sss.fff] 

Lorsque j’ai eu la malchance de devoir utiliser les idiosyncrasies HP-UX, j’écrivais souvent mes propres petits programmes pour faire exactement ce que je voulais. A condition que votre machine hokey-pux soit POSIXy, alors vous pourriez faire:

 $ cat fromnow.c #include  #include  int main(int argc, char *argv[]) { struct tm parsed; strptime(argv[1], argv[2], &parsed); printf("%.0f\n", difftime(time(NULL), mktime(&parsed))); return 0; } 

Comstackz-le:

 $ cc -o fromnow fromnow.c 

Exécuter:

 $ ./fromnow 5/13/13 %D 119451988 

qui calculera alors le nombre de secondes entre l’heure actuelle et la date “5/13/13” formaté en style américain “% D”. Le premier argument est la date, le second argument est le spécificateur de format pour parsingr cette date. Voir l’ homme strptime pour les options.

Cela pourrait être plus général, ou moins, en fonction de combien vous devez faire des calculs de date.

Vous ne savez pas quelle version de ksh vous utilisez.

 [STEP 101] $ echo ${.sh.version} Version AJM 93u+ 2012-08-01 [STEP 102] $ date=12/15/16 [STEP 103] $ [[ $date =~ (..)/(..)/(..) ]] [STEP 104] $ date=20${.sh.match[3]}-${.sh.match[1]}-${.sh.match[2]} [STEP 105] $ echo $date 2016-12-15 [STEP 106] $ old_seconds=$( printf '%(%s)T' $date ) [STEP 107] $ echo $old_seconds 1481797007 [STEP 108] $ now_seconds=$( printf '%(%s)T' ) [STEP 109] $ echo $now_seconds 1487845024 [STEP 110] $ (( diff = now_seconds - old_seconds )) [STEP 111] $ echo $diff 6048017 [STEP 112] $ echo $(( diff / 86400 )) days 70 days [STEP 113] $ 

Lorsque vous avez awk , vous pouvez calculer la différence avec

 LASTRESETDATE="12/15/16" endd="$(date '+%m/%d/%y')" awk -v startdate="${LASTRESETDATE}" -v enddate="${endd}" 'BEGIN { split(startdate,A,"[/]"); T1=mktime(A[3] " " A[1] " " A[2] " 12 0 0"); split(enddate,B,"[/]"); T2=mktime(B[3] " " B[1] " " B[2] " 12 0 0"); diffdays=(T2-T1)/(3600*24) printf("%s\n",diffdays); }' 

Lorsque vous en avez souvent besoin et que vous n’avez pas (la bonne version de) awk, vous pouvez créer une table de consultation sur un autre système. Avec awk :

 startd="12/15/16" endd="$(date '+%m/%d/%y')" awk -v startdate="${startd}" -v enddate="${endd}" 'BEGIN { split(startdate,A,"[/]"); T1=mktime(A[3] " " A[1] " " A[2] " 12 0 0"); split(enddate,B,"[/]"); T2=mktime(B[3] " " B[1] " " B[2] " 12 0 0"); linenr=1; while (T1 < T2) { printf("%d %s\n",linenr++, strftime("%m/%d/%y",T1)); T1+=3600*24; } }' 

Bien sûr, vous pouvez faire une liste avec Excel ou un autre outil.

EDIT: supprimé var que j'ai seulement utilisé le prototypage de la solution.