Existe-t-il un outil dans Solaris Unix (donc non GNU disponible) pour soustraire les dates? Je sais qu'à Linux, nous avons gawk
qui peut soustraire une date d'une autre. Mais dans Solaris Le maximum que nous avons est nawk
(amélioré awk
) qui ne peut pas effectuer les calculs de date. Je ne peux pas utiliser Perl.
Y a-t-il un moyen de faire des calculs de date comme 20100909 - 20001010
?
Mise à jour: est bc
capable d'effectuer des calculs de dates?
Voici un script AWK que je viens d'écrire, devrait travailler avec un Posix Awk. Vous devrez essayer la version Solaris; N'oubliez pas qu'il existe également deux versions de Awk sur Solaris, une dans/bin et une in/usr/xpg4/bin/awk (qui est Nawk, je crois).
BEGIN {
daysofmonth["01"] = 0; daysofmonth["02"] = 31; daysofmonth["03"] = 59;
daysofmonth["04"] = 90; daysofmonth["05"] = 120; daysofmonth["06"] = 151;
daysofmonth["07"] = 181; daysofmonth["08"] = 212; daysofmonth["09"] = 243;
daysofmonth["10"] = 273; daysofmonth["11"] = 304; daysofmonth["12"] = 334;
fullday = 86400;
}
/[12][09][0-9][0-9][01][0-9][0123][0-9]/ {
year = substr($0, 1, 4); month = substr($0, 5, 2); day = substr($0, 7, 2);
date = ((year - 1970) * 365.25) + daysofmonth[month] + day - 1;
if ((year % 4) == 0 && month > 2) { date = date + 1; }
print date * fullday - (25200);
}
{}
Passez une chaîne de date de la date de yyyymmdd à travers et il sera converti en nombre de secondes depuis l'époque (avec un peu de donner pour être des limites de jour). Ensuite, vous pourrez soustraire les deux.
today=`echo 20110210 | awk -f convdate.awk`
then=`echo 20001231 | awk -f convdate.awk`
sincethen=`expr $today - $then`
Malheureusement, aucune des utilitaires de ligne de commande POSIX ne fournit de l'arithmétique sur les dates. date -d
et date +%s
sont la voie à suivre si vous les avez, mais ils sont GNU Extensions.
Il y a un hack malade avec touch
ce genre de travail pour vérifier qu'une date est au moins N jours dans le passé:
touch -t 201009090000 stamp
if [ -n "$(find stamp -mtime +42)" ]; then ...
(Notez que ce code peut être éteint par un si DST démarré ou arrêté dans l'intervalle et le script fonctionne avant 1h du matin.)
Plusieurs personnes ont fini par mettre en œuvre des bibliothèques de manipulation de la date de mise en œuvre à Bourne ou à Posix Shell. Il y a quelques exemples et liens dans le Comp.unix.shell FAQ .
Installation GNU outils peut être le moyen de moindre douleur.
Pour l'enregistrement, DateUtils est ma tentative de fournir un ensemble d'outils portables qui couvrent les arithmétiques de la date. Votre exemple se résume à
ddiff -i '%Y%m%d' 20001010 20100909
=>
3621
Le -i
Spécifie le format d'entrée.
WRT GNU Date sur Solaris:
Je dis encore ça:
Trop de Solaris Sysadmins sont fiers de ne pas installer délibérément les paquets officiels de Sun (maintenant Oracle) qui font un système Solaris "GNU compatible" lorsqu'ils configurent un nouvel hôte. Me bat pourquoi.
GNU Date est excellent et doit être disponible par défaut sur n'importe quel hôte Solaris, IMHO.
Installez le package SFWCOREU depuis le CD Solaris Companion. Après l'installation, vous trouverez GNU date dans /opt/sfw/bin/date
Vous pouvez déjà l'avoir comme je pense que cela fait partie de l'installation standard. Il est cependant appelé gdate
afin de le distinguer de la version de Sun de la date.
Faites cela si non installé:
pKG Install // Solaris/Fichier/GNU-Coretutils
Si vous avez python:
from time import *
date1 = strptime("20100909","%Y%m%d")
date2 = strptime("20001010","%Y%m%d")
diff = mktime(date1) - mktime(date2)
print repr(d/86400) + " days"
Vous avez étiqueté votre question "Gawk" mais vous dites "non GNU outils". Gawk a datte l'arithmétique.
python:
from datetime import datetime as dt
a = dt(2010, 9, 9)
b = dt(2000, 10, 10)
print (a - b).days
Avec la date BSD pour MacOS:
echo "Quelle est la date de début ?"
read DATE_DE_DEBUT
echo "Quelle est la date de fin ?"
read DATE_DE_FIN
ANNEE=$(($(echo $DATE_DE_FIN | awk -F "/" '{print $3}')-$(echo $DATE_DE_DEBUT | awk -F "/" '{print $3}')))
echo " "
if [[ $ANNEE > 0 ]]; then
for((annee=$ANNEE-1 ; $ANNEE ; annee++))
do
#echo $annee
for((mois=0 ; 13 - $mois ; mois++))
do
# echo année:$annee mois:$mois
for((jour=0 ; 32 - $jour ; jour++))
do
# echo année:$annee mois:$mois jour:$jour
TEST=$(date -Rjf"%d/%m/%Y" -v +"$annee"y -v +"$mois"m -v +"$jour"d $DATE_DE_DEBUT +"%d/%m/%Y")
if [[ $TEST = $DATE_DE_FIN ]]; then
echo "Différence entre le $DATE_DE_DEBUT et le $DATE_DE_FIN";
echo "est de :";
echo "$annee année(s) $mois mois $jour jour(s)";
exit 0;
fi
done
done
done
else
annee=0
for((mois=0 ; 13 - $mois ; mois++))
do
# echo année:$annee mois:$mois
for((jour=0 ; 32 - $jour ; jour++))
do
#echo année:$annee mois:$mois jour:$jour
TEST=$(date -Rjf"%d/%m/%Y" -v +"$annee"y -v +"$mois"m -v +"$jour"d $DATE_DE_DEBUT +"%d/%m/%Y")
if [[ $TEST = $DATE_DE_FIN ]]; then
echo "Différence entre le $DATE_DE_DEBUT et le $DATE_DE_FIN";
echo "est de :";
echo "$annee année(s) $mois mois $jour jour(s)";
exit 0;
fi
done
done
fi