[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
alibat - 2 déc. 2015 à 11:29
A voir également:
- Linux date format yyyymmddhhmmss
- Format epub - Guide
- Telecharger format factory - Télécharger - Conversion & Codecs
- Format apfs - Guide
- Hp format tool - Télécharger - Stockage
- Format odt - Guide
12 réponses
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 896
3 août 2005 à 12:03
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;-))
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
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
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
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
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
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}
#
#!/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}
#
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 896
3 août 2005 à 11:43
3 août 2005 à 11:43
Voir là : http://www.commentcamarche.net/forum/affich-1712417#1
Z'@+...che.
Z'@+...che.
JP : Zen, my Nuggets ! ;-) Le savoir n'est bon que s'il est partagé.
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
3 août 2005 à 11:58
non ca marche pas...
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 ....
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 094
24 août 2005 à 14:58
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
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
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...
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...
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 :)
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 :)
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 :
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
à 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
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!
@+
DATE=$((`/bin/date +'%Y%m%d'` - 1))
La, c'est pour un format YYYYMMJJ, après, faites le à votre sauce!
@+
#!/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
#
#
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
#
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
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
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 }'
}
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 }'
}
3 août 2005 à 12:07
http://www.commentcamarche.net/forum/affich-1712417#1
le message d'erreur que j'obtiens...