¿Cómo puedo imprimir la fecha que es un día antes de la hora actual en Bash?
--date
o -d
solo está disponible en la fecha GNU
¿Cómo puedo imprimir la fecha que es un día antes de la hora actual en Bash?
--date
o -d
solo está disponible en la fecha GNU
Respuestas:
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
date -v-1d
en OSX (menos), -v+1d
(más)
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 }
Si tiene BSD (OSX) date
puede 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
date --date='-1 day'
date: illegal option -- -
date
, disponible a través del coreutils
paquete, 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 gdate
comando. Ver: topbug.net/blog/2013/04/14/…
MAC OS X
Para la fecha de ayer:
date -v-1d +%F
donde 1d define el día actual menos 1 día. Similar,
fecha -v-1w +% F - para la fecha de la semana anterior
fecha -v-1m +% F - para la fecha del mes anterior
SI TIENES FECHA GNU,
date --date="1 day ago"
Más información: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html
Guía avanzada de secuencias de comandos Bash
date +%Y:%m:%d -d "yesterday"
Para obtener detalles sobre el formato de fecha, consulte la página del manual para la fecha
date --date='-1 day'
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
bash $(TZ=America/New_York date +%Y-%m-%d)
¿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
date --date='-1 day'
#!/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 July , 2013
, el resultado que se imprime es 2013-6-1347
, mientras que el resultado esperado es2013-6-30
echo $(cal $month $year)|tr ' ' '\n'|tail -n 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 ;-)
date -d "yesterday" '+%Y-%m-%d'
o
date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date
date: illegal option: -d
Solaris. Su respuesta que se basa en extensiones GNU no portátiles a la date
utilidad estándar POSIX para una pregunta sobre la plataforma Solaris no GNU.
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
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
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9