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?


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

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

41
date --date='-1 day'

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


7

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

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


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

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


1
yesterday=`date -d "-1 day" %F`

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


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

+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 ;-)



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


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

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".


-2
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9

Et si aujourd'hui était le 1er janvier?
martin clayton
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.