web-dev-qa-db-fra.com

Obtenir la date (un jour avant l'heure actuelle) dans Bash

Comment puis-je imprimer la date qui est un jour avant l'heure actuelle dans Bash?

156
conandor

Désolé de ne pas mentionner I sur le système Solaris. En tant que tel, le commutateur -date n'est pas disponible sur Solaris bash.

Je découvre que je peux obtenir la date précédente avec un petit truc sur le fuseau horaire.

DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE
4
conandor

si vous avez GNU date et que je vous ai bien compris

$ date +%Y:%m:%d -d "yesterday"
2009:11:09

ou

$ date +%Y:%m:%d -d "1 day ago"
2009:11:09
249
ghostdog74

Si vous avez BSD (OSX) date, vous pouvez le faire comme ceci:

date -j -v-1d
Wed Dec 14 15:34:14 CET 2011

Ou si vous voulez faire des calculs de date à une date quelconque:

date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d"
2011-08-31
47
Jacob Persson
date --date='-1 day'
40
silent

MAC OSX

Pour la date d'hier:

date -v-1d +%F

1d définit le jour actuel moins un jour. De même,

date -v-1w +% F - pour la date de la semaine précédente

date -v-1m +% F - pour la date du mois précédent

SI VOUS AVEZ GNU DATE,

date --date="1 day ago"

Plus d'infos: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html

12
Maverick

C'est une réponse tardive, mais cela semble fonctionner!

     YESTERDAY=`TZ=GMT+24 date +%d-%m-%Y`;
     echo $YESTERDAY;
7
alpana

Guide avancé de script Bash

date +%Y:%m:%d -d "yesterday"

Pour plus de détails sur le format de date, voir la page de manuel de date

date --date='-1 day'
5
Peter Lindqvist

Utilisez Perl à la place peut-être?

Perl -e 'print scalar localtime( time - 86400 ) . "\n";'

Ou utilisez nawk et (ab) utilisez/usr/bin/adb:

nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb

Entré à travers cela aussi ... fou!

/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ {gsub(/ /,"",$2);printf "0t%d=Y\n", $2-86400}' | adb
3
martin clayton

Vous pouvez faire un calcul simple, avec une regex, si le format de date choisi est 'AAAAMM':

echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'

En janvier 2020, il renverra 201912 ;-) Mais ce n’est qu’une solution de contournement, lorsque la date n’a pas d’options de calcul et que d’autres options d’interprétation de date (par exemple, en utilisant Perl) ne sont pas disponibles ;-)

1
Sven
#!/bin/bash
OFFSET=1;
eval `date "+day=%d; month=%m; year=%Y"`
# Subtract offset from day, if it goes below one use 'cal'
# to determine the number of days in the previous month.
day=`expr $day - $OFFSET`
if [ $day -le 0 ] ;then
month=`expr $month - 1`
if [ $month -eq 0 ] ;then
year=`expr $year - 1`
month=12
fi
set `cal $month $year`
xday=${$#}
day=`expr $xday + $day`
fi
echo $year-$month-$day
1
medoix
yesterday=`date -d "-1 day" %F`

Place la date d'hier au format AAAA-MM-JJ dans la variable $yesterday.

1
Heinzi
date --date='-1 day'
 </ code>
1
DigitalRoss

Essayez le code ci-dessous, qui traite également de la partie DST.

if [ $(date +%w) -eq $(date -u +%w) ]; then
  tz=$(( 10#$gmthour - 10#$localhour ))
else
  tz=$(( 24 - 10#$gmthour + 10#$localhour ))
fi
echo $tz
myTime=`TZ=GMT+$tz date +'%Y%m%d'`

Courtsey Ansgar Wiechers

0
misguided

Solution sensible à l'heure d'été:

La manipulation du fuseau horaire est possible pour changer l'horloge de quelques heures. En raison de l'heure d'été, il peut y avoir 24 heures aujourd'hui ou avant-hier.

Vous êtes sûr qu'hier, il y a 20 ou 30 heures. Laquelle? Eh bien, le plus récent n'est pas aujourd'hui.

echo -e "$(TZ=GMT+30 date +%Y-%m-%d)\n$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1

Le paramètre -e utilisé dans la commande echo est nécessaire avec bash, mais ne fonctionnera pas avec ksh. En ksh, vous pouvez utiliser la même commande sans l'indicateur -e.

Lorsque votre script sera utilisé dans différents environnements, vous pouvez le démarrer avec #!/Bin/ksh ou #!/Bin/bash. Vous pouvez également remplacer le\n par une nouvelle ligne:

echo "$(TZ=GMT+30 date +%Y-%m-%d)
$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1
0
Walter A