[shell/unix] date de la veille

Résolu/Fermé
jebok
Messages postés
358
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
23 octobre 2007
- 3 août 2005 à 10:57
 alibat - 2 déc. 2015 à 11:29
Bonjour,

Quelle commande (en shell-UNIX) permet d'afficher la date de la veille ?
PS : je précise que c'est pour un script en ksh

12 réponses

jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 900
3 août 2005 à 12:03
Ben si ça marche, la preuve :
En bash

[jp@Mandrake jp]$ date --date '1 days ago'
mar aoû  2 11:38:36 CEST 2005

On change de shell (la commande est un alias)

[jp@Mandrake jp]$ kosh

$ date --date '2 days ago'
lun aoû  1 11:39:00 CEST 2005

$ date --date '1 days ago'
mar aoû  2 11:39:22 CEST 2005
;-))
15
jebok
Messages postés
358
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
23 octobre 2007
51
3 août 2005 à 12:07
regarde sur
http://www.commentcamarche.net/forum/affich-1712417#1
le message d'erreur que j'obtiens...
0
Sous solaris et HP-UX, il existe une solution plus simple que de creer un script.
Il suffit de jouer avec le fuseau horaire (variable systeme $TZ).

Exemple :
# echo `TZ=MET+24 date +"%D"`
donne: 11/28/05 (nous sommes le 11/29/05)

Le « +24 » correspond au nombre d’heures a "retrancher" (+) de l’heure actuelle, si tu veux les ajouter, utilises le - (voir plus bas)
Le %D correspond à la mise en forme de la date (cf man date) : mm/dd/yy

De la meme facon tu pourrais obtenir la date du lendemain sous le format aaaammjj, par exemple….
#echo `TZ=MET-24 date +"%Y%m%d"`
donne : 20051128

... ou du surlendemain (ne marche que sous solaris):
#echo `TZ=MET-48 date +"%Y%m%d"`
cette derniere commande ne marche pas sous HP-UX car il semble qu'on ne puisse pas faire plus d'une fois le tour de la terre avec HP :p
14
Sur Solaris ça marche pour maximum quelques jours de décallage.
Pour plus que ça, faut compiler un fichier avec "zic", ex:

-bash-3.00$ cat Delta
# Example : 100 jours dans le futur 100*24 heures
Zone POSE/Zulu+2400 2400 - POSE
# Example : 365 jours dans le passé 365*24 heures
Zone POSE/Zulu-8760 -8760 - POSE
# Example : 1 ans et 3 mois dans le passé : (365+90)*24 heures
Zone POSE/Zulu-10920 -10920 - POSE
# Example : 2 ans et 3 mois dans le passé : (2*365+90)*24 heures
Zone POSE/Zulu-19680 -19680 - POSE
# Example : 5 ans et 3 mois dans le passé : (5*365+90)*24 heures
Zone POSE/Zulu-46008 -46008 - POSE

-bash-3.00$ /usr/sbin/zic Delta
-bash-3.00$ TZ=POSE/Zulu+2400 date
Thu Jan 19 12:36:59 POSE 2012
-bash-3.00$ TZ=POSE/Zulu-46008
-bash-3.00$ date
Wed Jul 12 12:32:20 POSE 2006
0
Super ça marche merci beaucoup =)
0
En un ligne :
date -d yesterday +%F
11
sclamagirand
Messages postés
1
Date d'inscription
mercredi 24 août 2005
Statut
Membre
Dernière intervention
24 août 2005
5
24 août 2005 à 14:16
Voila un script qui doit fonctionner :

#!/bin/ksh
#
set -A DAYS Sat Sun Mon Tue Wed Thu Fri Sat
set -A MONTHS Dec Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
#
# fonctionne sous Linux
#
# date -d '1 days ago'
#
YESTERDAY=$((`date +%d` -1))
MONTH=`date +%m`
YEAR=`date +%Y`
NDAY=`date +%u`
WEEKDAY=${DAYS[`date +%u`]}
#
if [ $YESTERDAY -eq "0" ];
then
#
MONTH=$((MONTH-1))
#
if [ $MONTH -eq "0" ];
then
#
MONTH=12
YEAR=$((YEAR-1))
#
fi
#
set `cal $MONTH ${YEAR}`
shift $(($# - 1))
YESTERDAY=$1
#
fi
#
TMONTH=${MONTHS[MONTH]}
YEAR2=${YEAR##20}
#
# uncomment next line for debugging
#
echo ${WEEKDAY} ${YESTERDAY} ${TMONTH} ${YEAR}
#
echo ${YESTERDAY}${MONTH}${YEAR2}
#
5
Merci slamagirand, c'est nickel !!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 900
3 août 2005 à 11:43
Voir là : http://www.commentcamarche.net/forum/affich-1712417#1
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé. 
1
jebok
Messages postés
358
Date d'inscription
lundi 16 mai 2005
Statut
Membre
Dernière intervention
23 octobre 2007
51
3 août 2005 à 11:58
non ca marche pas...
0
if [ `expr `date +%d` - 1` -le 0 ]; then
cal | grep -E "28|29|30|31" | awk ...........
fi


enfin bref je vais l'ecrire quand même ....
1
[Dal]
Messages postés
5882
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
28 juin 2022
1 002
24 août 2005 à 14:58
Bonjour,

On peut aussi convertir la date courante en secondes depuis Epoch, puis soustraire 86400 (24*60*60) au résultat et reconvertir le chiffre obtenu au format de date souhaité.

Voir man date, et man strftime pour les formats.


Dal
1
lionel sévérian
5 mai 2006 à 16:32
voici la solution à ton problème. ça marche et c'est ksh AIX...

GetDate()
{ # GetDate nDays [format]
# Exemple d'utilisation: export NAMEDIR=$(GetDate -1 '+%Y.%m.%d')

typeset -i nDays=$1; format=$2
eval $(echo $TZ | sed '
s!\([^-0-9]*\)\([-0-9]*\)\(.*\)!typeset -i localOffset=\2;zon1=\1;zon2=\3!')
TZ=$zon1$((localOffset-24*nDays))$zon2 date $format

}


A utiliser en fonction KSH sans modération...
Fais toi un Copier/Coller de tous ce qui est en gras...
1
Merci pour ce code il m'a bien dépanné !! (et merci google)

mon problème était légèrement différent, je voulais trouver la date du dernier dimanche ...

Grâce à ton script j'ai pu faire ça :

case $(date +%a) in
Mon ) diff=-1;;
Tue ) diff=-2;;
Wed ) diff=-3;;
Thu ) diff=-4;;
Fri ) diff=-5;;
Sat ) diff=-6;;
Sun ) diff=0;;
esac
DATE1=$(GetDate $diff '+%d/%m/%Y')

ça marche mais c'est pas très joli :)

ça serait possible de faire une fonction GetDate2 ? avec comme paramètre $1 = le jour à obtenir (pour le dernier dimanche on met Sun) et $2 toujours le format

chui sûr que ça peut être fait en récursif en plus :)
0
la syntaxe date X days ago n'existe pas sur tous les linux pas du tout sur les unix proprietaires et pas sur tous les BSD non plus !

à proscrire à jamais par concéquence.
une des solutions simple :
expr `date +%d` - 1


et bien sur si on veut gerer le moi et l'année il faut faire un shellscript
qui test si le jour est 0 alors faire cal du moi précédent pour voir si il se fini par 28,29,30,31 et si on est janvier faire année -1

rien de plus simple quoi
0
Super! Tu nous sauve la vie
0
tontonserver
25 janv. 2008 à 16:33
Pour le calcul de la date à J-1, faut pas se prendre la tête:
DATE=$((`/bin/date +'%Y%m%d'` - 1))
La, c'est pour un format YYYYMMJJ, après, faites le à votre sauce!
@+
0
Ca marche pas les 1ers du mois!!
0
#!/bin/ksh
#
set -A DAYS Sat Sun Mon Tue Wed Thu Fri Sat
set -A MONTHS Dec Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
set -A MONTH_ 12 01 02 03 04 05 06 07 08 09 10 11 12
set -A DAYS_ 09 01 02 03 04 05 06 07 08 09
#
# fonctionne sous Linux
#
# date -d '1 days ago'
#
#YESTERDAY=$((`date +%d` -1))
date1=20070101
YESTERDAY=$((`date -d $date1 +%d` -1))
MONTH=`date -d $date1 '+%m' `
YEAR=`date -d $date1 '+%Y' `
NDAY=`date -d $date1 '+%d' `

WEEKDAY=${DAYS[`date +%u`]}
#
if [ $YESTERDAY -eq "0" ];
then
#
MONTH=$((MONTH-1))
#
if [ $MONTH -eq "0" ];
then
#
MONTH=12
YEAR=$((YEAR-1))
#
fi
#
set `cal $MONTH ${YEAR}`
shift $(($# - 1))
YESTERDAY=$1
#
fi
#
YESTERDAY_=$YESTERDAY
if [ $YESTERDAY -ne "0" ];
then
if [ $YESTERDAY -le 9 ];
then
#
YESTERDAY_=${DAYS_[YESTERDAY]}
#
fi
fi
#
TMONTH=${MONTHS[MONTH]}
T_MONTH=${MONTH_[MONTH]}
YEAR2=${YEAR##20}
#
# uncomment next line for debugging
#
echo ${WEEKDAY} ${YESTERDAY} ${TMONTH} ${YEAR}
#
#echo ${YESTERDAY}${MONTH}${YEAR2}
#
date=${YEAR}${T_MONTH}${YESTERDAY_}
echo $date
#
0
Bonjour,

date=$(date)
set $date

date=$(date --date '1 days ago')
set $datedate=$(date)
set $date


Je souhaiterais faire un fichier avec 2 variable de temps pour faire une comparaisons.
diff -c /home/file_.$2$3 /home/file_.$2$3-1j > /home/test.log
0
essaie d'utiliser la commande suivante :
DTE=`date --date '24 hour ago' '+%Y%m%d'`
0
Utilise les fonctiones suivantes :

function TimeToSecond {
# ${1} = Optional date and time (YYYYMMDDHHMMSS); it defaults to current time
( typeset -r awk_date="\"y=\" substr(\$1,01,4) \"\\nm=\" substr(\$1,05,2) \"\\nd=\" substr(\$1,07,2)"
typeset -r awk_time="\"h=\" substr(\$1,09,2) \"\\ni=\" substr(\$1,11,2) \"\\ns=\" substr(\$1,13,2)"
if [ -z "${1}" ]
then date +%Y%m%d%H%M%S
else echo "${1}"
fi |\
awk "{ print ${awk_date} \"\\n\" ${awk_time} }"
echo
echo "m += 9"
echo "if (m <= 11) {"
print "\ty -= 1 }"
echo "if (m > 11) {"
print "\tm -= 12 }"
print "(((((y-1)*1461+1)/4 - y/100 + y/400 + (m*153+2)/5 + d + 59)*24 + h)*60 + i)*60 + s")\
| bc
}

function SecondsToTime {
# ${1} = number of seconds since January 1sh of year 0001
( echo "s = ${1}"
echo "i = s/60"
echo "s -= i*60"
echo "h = i/60"
echo "i -= h*60"
echo "d = h/24"
echo "h -= d*24"
echo "d += 305"
echo "b = d/146097"
echo "d -= b*146097"
echo "y = b*400"
echo "b = d/36524"
echo "if (b > 3) {"
print "\tb = 3 }"
echo "d -= b*36524"
echo "y += b*100"
echo "b = d/1461"
echo "d -= b*1461"
echo "y += b*4"
echo "b = d/365"
echo "if (b > 3) {"
print "\tb = 3 }"
echo "d -= b*365"
echo "y += b"
echo "m = (d*5+2)/153"
echo "d -= (m*153+2)/5-1"
echo "m += 3"
echo "if (m > 12) {"
print "\tm -= 12"
print "\ty += 1 }"
echo "y"
echo "m"
echo "d"
echo "h"
echo "i"
echo "s"
)\
| bc | paste -s - | awk '{ printf "%04d%02d%02d%02d%02d%02d\n",$1,$2,$3,$4,$5,$6 }'
}
0