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

171

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

conandor
la source
Date essayée mais il semble qu'il n'y ait pas de commutateur -d dans la bash de Solaris 10
Conandor
J'ai trouvé une autre excellente solution en installant gnu date (package coreutil) à partir de sunfreeware.
conandor le
il n'y a pas non plus de commutateur -d dans la date d'AIX
Frankster
L' option --dateou -dn'est disponible qu'en date GNU
Chris FA Johnson
Voir stackoverflow.com/q/15374752/462865 pour une version compatible DST de cette question.
Amir Ali Akbari

Réponses:

262

si vous avez une date GNU 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
ghostdog74
la source
1
J'ai trouvé que la plupart étaient des réponses suggérées, mais le commutateur -d ne se trouve pas dans la date de Solaris
conandor
3
Pour l'utilisation sur Ubuntu avec la fonction de date: $ (date +% Y:% m:% d -d "il y a 1 jour"), la sortie est: 2013: 04: 21. Et si vous voulez la date 10 jours avant, vous pouvez utiliser $ (date +% Y:% m:% d -d "il y a 10 jours") ou $ (date +% Y:% m:% d -d "10 il y a jour ")
zhihong
Sur OS X, vous pouvez installer coreutils via brew: voir stackoverflow.com/questions/15374752
...
11
date -v-1dsur OSX (minus), -v+1d(plus)
bgs
2
Cette fonction bash fonctionnera à la fois sous Linux et OSX. Fondamentalement, il essaie d'abord le style GNU Linux. Si cela échoue, il essaie le style OSX. Appelez-le avec un argument du nombre de jours dans le passé où vous voulez la date. Si vous ne passez aucun argument, cela suppose 0 jours. Ce code est une seule ligne, donc le copier-coller devrait fonctionner - aucune fin de ligne supposée. date_days_past () { days_past=${1:-0}; if ! date -v-${days_past}d +%Y%m%d 2>/dev/null; then date --date="-${days_past} day" +%Y%m%d; fi }
Noah Spurrier
50

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

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

Ou si vous souhaitez effectuer des calculs de date à une date arbitraire:

date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d"
2011-08-31
Jacob Persson
la source
41
date --date='-1 day'
silencieux
la source
4
Erros sur macOS Sierra:date: illegal option -- -
kuanb
2
Vous devez installer la version GNU de date, disponible via le coreutilspackage, pour que cette syntaxe fonctionne sur macOS. Si vous utilisez Homebrew, vous pouvez l'installer via brew install coreutils, après quoi vous devriez pouvoir utiliser la date GNU via la gdatecommande. Voir: topbug.net/blog/2013/04/14/…
sumitsu
17

MAC OS X

Pour la date d'hier:

date -v-1d +%F

1d définit le jour en cours moins 1 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 LA DATE GNU,

date --date="1 day ago"

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

Maverick
la source
7

Eh bien, c'est une réponse tardive, mais cela semble fonctionner !!

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

Guide de script Bash avancé

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

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

date --date='-1 day'
Peter Lindqvist
la source
4

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
conandor
la source
Cette méthode n'est pas fiable à 100% (environ 98% en fait) si vous vivez dans un endroit utilisant l'heure d'été.
jlliagre
Pas exactement, vous pouvez utiliser bash $(TZ=America/New_York date +%Y-%m-%d)
phray2002
3

Utiliser 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

Je suis tombé sur ça aussi ... fou!

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

date --date='-1 day'

DigitalRoss
la source
1
yesterday=`date -d "-1 day" %F`

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

Heinzi
la source
1
#!/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
Medoix
la source
+1 pour la correction, méthode intéressante, même si c'est un peu verbeux.
Peter Lindqvist
1
Bonjour medoix, je n'arrive pas à trouver la signification de $ {$ #}. Je sais que $ # représente le nombre d'arguments d'un script / d'une fonction. Mais je ne suis pas en mesure de comprendre cela. Veuillez aider.
Karthick S
Cela ne fonctionne pas pour le jour précédent lors du changement de mois. Par exemple aujourd'hui 1 July , 2013, le résultat en cours d'impression est 2013-6-1347, alors que le résultat attendu est2013-6-30
malavisé
Au lieu des 3 lignes entre le "fi" try "day = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1"
Anton Roslov
1

Vous pouvez faire un calcul simple, enrichi d'une expression régulière, si le format de date choisi est 'AAAAMM':

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

En janvier 2020, il retournera 201912 ;-) Mais, ce n'est qu'une solution de contournement, lorsque la date n'a pas d'options de calcul et d'autres options d'interpréteur de date (par exemple en utilisant perl) non disponibles ;-)

Sven
la source
1
date -d "yesterday" '+%Y-%m-%d'

ou

date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date
suresh Palemoni
la source
Cela se traduit par date: illegal option: -dSolaris. Votre réponse qui s'appuie sur des extensions GNU non portables de l' dateutilitaire standard POSIX pour une question sur la plate-forme Solaris non GNU.
Andrew Henle le
0

Essayez le code ci-dessous, qui s'occupe é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

égaré
la source
0

Solution compatible DST:

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

Vous êtes sûr qu'hier, c'est il y a 20 ou 30 heures. Laquelle? Eh bien, le plus récent qui 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. Dans ksh, vous pouvez utiliser la même commande sans l'option -e.

Lorsque votre script sera utilisé dans différents environnements, vous pouvez démarrer le script 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
Walter A
la source
0

Pas très sexy mais pourrait faire le travail:

perl -e 'my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 86400);$year += 1900; $mon+= 1; printf ("YESTERDAY: %04d%02d%02d \n", $year, $mon, $mday)'

Formé à partir de la réponse "martin clayton".

trox
la source
-2
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9
Vijay
la source
Et si aujourd'hui était le 1er janvier?
martin clayton