web-dev-qa-db-fra.com

Outil in Unix pour soustraire les dates

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?

23
jyz

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`
10
Arcege

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.

8
hroptatyr

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.

Sur Solaris 10

Installez le package SFWCOREU depuis le CD Solaris Companion. Après l'installation, vous trouverez GNU date dans /opt/sfw/bin/date

Sur Solaris 11

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
3
peterh

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
2
akira

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
0
OlivierOR