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?


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

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

41
date --date='-1 day'

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;


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

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


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

Pone la fecha de ayer en formato AAAA-MM-DD en 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 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 ;-)



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


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

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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.