2009-11-10 16 views

Respuesta

197

si tiene fecha de GNU y le he entendido bien

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

o

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

Encontré la mayoría como respuesta sugerida, pero el modificador -d no se encuentra en la fecha de Solaris – conandor

+7

No creo que esto funcione en FreeBSD o OS X. –

+2

Para el uso en Ubuntu con función de fecha: $ (date +% Y:% m:% d -d "1 día atrás"), salida es: 2013: 04: 21. Y si desea que la fecha de 10 días antes, se puede utilizar $ (date +% Y:% M:% d -d "hace 10 días") o $ (date +% Y:% m: % d -d "10 días atrás") – zhihong

34
date --date='-1 day' 
+2

Erros en macOS Sierra:' fecha: opción ilegal - -'' – kuanb

+0

Necesita instalar la versión GNU de 'date', disponible a través del paquete' coreutils', para hacer que esta sintaxis funcione en macOS. Si está utilizando Homebrew, puede instalarlo a través de 'brew install coreutils', luego de lo cual debería poder usar la fecha GNU a través del comando' gdate'. Consulte: https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/ – Sumitsu

+0

para macos puede usar 'date -v -1d' (mira la 'fecha del hombre') – silent

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 
+0

+1 para la corrección, método interesante, aunque es un poco detallado. –

+1

Hola medoix, no puedo encontrar el significado de $ {$ #}. Sé que $ # representa la cantidad de argumentos para un script/función. Pero no soy capaz de relacionarme con esto. Por favor ayuda. –

+0

Esto no funciona el día anterior al cambio de mes. Por ejemplo, hoy es '1 de julio de 2013', el resultado que se imprimirá es' 2013-6-1347', mientras que el resultado esperado es '2013-6-30' – misguided

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

Pone la fecha de ayer en el formato AAAA-MM-DD en la variable $yesterday.

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

¿Qué tal si hoy es el 1 de enero? –

3

uso de Perl en su lugar, tal vez?

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

O, uso y nawk (ab) usar/usr/bin/ADB:

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

Encontré this ... demasiado loco!

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

Lo siento, no menciono I en el sistema Solaris. Como tal, el modificador de fecha no está disponible en Solaris bash.

Descubro que puedo obtener la fecha anterior con un pequeño truco en la zona horaria.

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

Este método no es 100% confiable (aproximadamente 98% en realidad) si usted vive en un lugar que usa el horario de verano. – jlliagre

39

Si tiene BSD (OSX) date puede hacerlo de esta manera:

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

O si usted quiere hacer cálculos de fechas en una fecha arbitraria:

date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d" 
2011-08-31 
3

El La opción --date o -d solo está disponible en la fecha GNU.

$ date --date 'yesterday' +%F 
date: illegal time format 
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
     [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format] 
6

Bueno, esta es una respuesta tardía, pero parece que funciona.

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

Pruebe el siguiente código, que también se ocupa de la parte 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

DST solución consciente:

La manipulación de la zona horaria es posible para cambiar el reloj algunas horas. Debido al horario de verano, las 24 horas pueden ser hoy o anteayer.

Estás seguro de que ayer fue hace 20 o 30 horas. ¿Cúal? Bueno, el más reciente que no es hoy.

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 

El parámetro -e utilizado en el comando echo se necesita con bash, pero no funciona con ksh. En ksh puede usar el mismo comando sin el distintivo -e.

Cuando su script se utilizará en diferentes entornos, puede iniciar el script con #!/Bin/ksh o #!/Bin/bash. También puede sustituir el \ n de una nueva línea:

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