Obtenga la fecha (un día antes de la hora actual) en Bash

171

¿Cómo puedo imprimir la fecha que es un día antes de la hora actual en Bash?

conandor
fuente
Fecha de prueba pero parece que no hay un interruptor -d en la fiesta de Solaris 10
conandor
Encontré otra gran solución instalando gnu date (paquete coreutil) desde sunfreeware.
conandor
ni existe un modificador -d en la fecha de AIX
frankster
La opción --dateo -dsolo está disponible en la fecha GNU
Chris FA Johnson
Consulte stackoverflow.com/q/15374752/462865 para obtener una versión segura de DST de esta pregunta.
Amir Ali Akbari

Respuestas:

262

si tienes una fecha GNU y te entendí correctamente

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

o

$ date +%Y:%m:%d -d "1 day ago"
2009:11:09
ghostdog74
fuente
1
He encontrado la mayoría son como respuesta sugerida pero modificador -d no se encuentra en la fecha de Solaris
conandor
3
Para el uso en Ubuntu con la función de fecha: $ (fecha +% Y:% m:% d -d "hace 1 día"), la salida es: 2013: 04: 21. Y si desea la fecha 10 días antes, puede usar $ (fecha +% Y:% m:% d -d "hace 10 días") o $ (fecha +% Y:% m:% d -d "10 hace un día ")
zhihong
En OS X puede instalar coreutils a través de brew: consulte stackoverflow.com/questions/15374752/…
kasterma
11
date -v-1den OSX (menos), -v+1d(más)
bgs
2
Esta función bash funcionará tanto en Linux como en OSX. Básicamente, prueba el estilo GNU Linux primero. Si eso falla, prueba el estilo OSX. Llámelo con un argumento de la cantidad de días en el pasado que desea la fecha. Si no pasa ningún argumento, asume 0 días. Este código es de una sola línea, por lo que cortar y pegar debería funcionar, no se suponen finales de línea. 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 tiene BSD (OSX) datepuede hacerlo así:

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

O si desea hacer cálculos de fecha en una fecha arbitraria:

date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d"
2011-08-31
Jacob Persson
fuente
41
date --date='-1 day'
silencio
fuente
44
Erros en macOS Sierra:date: illegal option -- -
kuanb
2
Debe instalar la versión GNU de date, disponible a través del coreutilspaquete, para que esta sintaxis funcione en macOS. Si está utilizando Homebrew, puede instalarlo a través de brew install coreutils, después de lo cual debería poder usar la fecha GNU a través del gdatecomando. Ver: topbug.net/blog/2013/04/14/…
sumitsu
7

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

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

Perdón por no mencionar I en el sistema Solaris. Como tal, el modificador -date no está disponible en Solaris bash.

Descubrí 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
conandor
fuente
Este método no es 100% confiable (aproximadamente 98% en realidad) si vives en un lugar que usa el horario de verano.
jlliagre
No exactamente, puedes usar bash $(TZ=America/New_York date +%Y-%m-%d)
phray2002
3

¿Usar Perl en su lugar quizás?

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

O use nawk y (ab) use / usr / bin / adb:

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

Encontré esto también ... ¡loco!

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

date --date='-1 day'

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

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

Heinzi
fuente
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
fuente
+1 para corrección, método interesante, aunque es un poco detallado.
Peter Lindqvist
1
Hola medoix, no puedo encontrar el significado de $ {$ #}. Sé que $ # representa el número de argumentos para un script / función. Pero no puedo relacionarme con esto. Por favor ayuda.
Karthick S
Esto no funciona para el día anterior en el cambio de mes. Por ejemplo, hoy es 1 July , 2013, el resultado que se imprime es 2013-6-1347, mientras que el resultado esperado es2013-6-30
equivocado
En lugar de las 3 líneas entre el "fi" intente "día = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1"
Anton Roslov
1

Podría hacer un cálculo simple, con una expresión regular, si el formato de fecha elegido es 'AAAAMM':

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

En enero de 2020 devolverá 201912 ;-) Pero, es solo una solución, cuando la fecha no tiene opciones de cálculo y otras opciones de intérprete de fechas (por ejemplo, usar perl) no están disponibles ;-)

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

o

date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date
suresh Palemoni
fuente
Eso se traduce en date: illegal option: -dSolaris. Su respuesta que se basa en extensiones GNU no portátiles a la dateutilidad estándar POSIX para una pregunta sobre la plataforma Solaris no GNU.
Andrew Henle
0

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

equivocado
fuente
0

Solución consciente del horario de verano:

La manipulación de la zona horaria es posible para cambiar el reloj algunas horas. Debido al horario de verano, hace 24 horas puede 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 es necesario con bash, pero no funcionará con ksh. En ksh puede usar el mismo comando sin la bandera -e.

Cuando su script se utilizará en diferentes entornos, puede iniciar el script con #! / Bin / ksh o #! / Bin / bash. También puede reemplazar el \ n por 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
Walter A
fuente
0

No es muy sexy, pero podría hacer el trabajo:

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)'

Formado a partir de la respuesta "Martin Clayton".

trox
fuente
-2
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9
Vijay
fuente
¿Y si hoy es el 1 de enero?
Martin Clayton