Fecha de ayer

Resuelto
jebok Mensajes publicados 371 Fecha de registro   Estado Miembro -  
 alibat -
Bonjour,

¿Qué comando (en shell-UNIX) permite mostrar la fecha de ayer?
PD: aclaro que es para un script en ksh

--
Gracias por su ayuda

12 respuestas

jipicy Mensajes publicados 40842 Fecha de registro   Estado Moderador Última intervención   4 898
 
Ben si ça marche, la preuve :
En bash [jp@Mandrake jp]$ date --date '1 days ago' mar ago 2 11:38:36 CEST 2005 On change de shell (la commande est un alias) [jp@Mandrake jp]$ kosh $ date --date '2 days ago' lun ago 1 11:39:00 CEST 2005 $ date --date '1 days ago' mar ago 2 11:39:22 CEST 2005 
;-))
--
Z'@+...che.
JP : Zen, mis Nuggets ! ;-) El saber sólo es bueno si se comparte. 
15
jebok Mensajes publicados 371 Fecha de registro   Estado Miembro 51
 
mira en
http://www.commentcamarche.net/forum/affich-1712417#1
el mensaje de error que obtengo...

--
Gracias por tu ayuda
0
raidcha
 
Bajo Solaris y HP-UX, hay una solución más simple que crear un script.
Solo es necesario jugar con el huso horario (variable del sistema $TZ).

Ejemplo:
# echo `TZ=MET+24 date +"%D"`
da: 11/28/05 (hoy es 11/29/05)

El « +24 » corresponde al número de horas a "reducir" (+) de la hora actual, si quieres añadirlas, usa el - (ver más abajo)
El %D corresponde al formato de la fecha (ver man date): mm/dd/yy

De la misma manera podrías obtener la fecha del día siguiente en el formato aaaammjj, por ejemplo….
#echo `TZ=MET-24 date +"%Y%m%d"`
da: 20051128

... o del día siguiente (solo funciona en Solaris):
#echo `TZ=MET-48 date +"%Y%m%d"`
este último comando no funciona en HP-UX porque parece que no se puede dar más de una vuelta al mundo con HP :p
14
Lucien Hercaud
 
En Solaris funciona para un máximo de unos pocos días de diferencia.
Para más que eso, hay que compilar un archivo con "zic", ej:

-bash-3.00$ cat Delta
# Ejemplo: 100 días en el futuro 100*24 horas
Zona POSE/Zulu+2400 2400 - POSE
# Ejemplo: 365 días en el pasado 365*24 horas
Zona POSE/Zulu-8760 -8760 - POSE
# Ejemplo: 1 año y 3 meses en el pasado: (365+90)*24 horas
Zona POSE/Zulu-10920 -10920 - POSE
# Ejemplo: 2 años y 3 meses en el pasado: (2*365+90)*24 horas
Zona POSE/Zulu-19680 -19680 - POSE
# Ejemplo: 5 años y 3 meses en el pasado: (5*365+90)*24 horas
Zona POSE/Zulu-46008 -46008 - POSE

-bash-3.00$ /usr/sbin/zic Delta
-bash-3.00$ TZ=POSE/Zulu+2400 date
Jue Ene 19 12:36:59 POSE 2012
-bash-3.00$ TZ=POSE/Zulu-46008
-bash-3.00$ date
Mié Jul 12 12:32:20 POSE 2006
0
ZdraL
 
Super, eso funciona, ¡muchas gracias! =)
0
Cyrus
 

fecha -d ayer +%F
11
sclamagirand Mensajes publicados 1 Estado Miembro 5
 
Aquí está el script que debe funcionar:

#!/bin/ksh
#
set -A DAYS Sab Dom Lun Mar Mié Jue Vie Sab
set -A MONTHS Dic Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic
#
# funciona en Linux
#
# date -d '1 days ago'
#
AYER=$((`date +%d` -1))
MES=`date +%m`
AÑO=`date +%Y`
DÍA=`date +%u`
DÍAS_EMB=${DAYS[`date +%u`]}
#
if [ $AYER -eq "0" ];
then
#
MES=$((MES-1))
#
if [ $MES -eq "0" ];
then
#
MES=12
AÑO=$((AÑO-1))
#
fi
#
set `cal $MES ${AÑO}`
shift $(($# - 1))
AYER=$1
#
fi
#
TMES=${MONTHS[MES]}
AÑO2=${AÑO##20}
#
# descomentar la siguiente línea para depuración
#
echo ${DÍAS_EMB} ${AYER} ${TMES} ${AÑO}
#
echo ${AYER}${MES}${AÑO2}
#
5
skea
 
Gracias slamagirand, ¡está perfecto!
0
jipicy Mensajes publicados 40842 Fecha de registro   Estado Moderador Última intervención   4 898
 
Ver aquí : http://www.commentcamarche.net/forum/affich-1712417#1
Z'@+...che.
JP : ¡Zen, mis Nuggets! ;-) El conocimiento solo es bueno si se comparte. 
1
jebok Mensajes publicados 371 Fecha de registro   Estado Miembro 51
 
no, no funciona...

--
Gracias por su ayuda
0
francis
 
si [ `expr `date +%d` - 1` -le 0 ]; alors cal | grep -E "28|29|30|31" | awk ........... fi 


enfin bref je vais l'écrire quand même ....
1
[Dal] Mensajes publicados 6122 Fecha de registro   Estado Colaborador Última intervención   1 108
 
Hola,

También se puede convertir la fecha actual en segundos desde Epoch, luego restar 86400 (24*60*60) al resultado y reconvertir el número obtenido al formato de fecha deseado.

Ver man date y man strftime para los formatos.

Dal
1
lionel sévérian
 
Aquí está la solución a tu problema. Funciona y es KSH AIX...

GetDate()
{ # GetDate nDays [formato]
# Ejemplo de uso: export NAMEDIR=$(GetDate -1 '+%Y.%m.%d')

typeset -i nDays=$1; formato=$2
eval $(echo $TZ | sed '
s!\([^-0-9]*\)\([-0-9]*\)\(.*\)!typeset -i localOffset=\2;zon1=\1;zon2=\3!')
TZ=$zon1$((localOffset-24*nDays))$zon2 date $formato

}


A utilizar en función KSH sin moderación...
Haz un Copiar/Pegar de todo lo que está en negrita...
1
Vag
 
¡Gracias por este código, me ha ayudado mucho! (y gracias Google)

Mi problema era un poco diferente, quería encontrar la fecha del último domingo...

Gracias a tu script pude hacer esto:

case $(date +%a) in
Lun ) diff=-1;;
Mar ) diff=-2;;
Mié ) diff=-3;;
Jue ) diff=-4;;
Vie ) diff=-5;;
Sáb ) diff=-6;;
Dom ) diff=0;;
esac
DATE1=$(GetDate $diff '+%d/%m/%Y')

funciona, pero no es muy bonito :)

¿Sería posible hacer una función GetDate2? con el parámetro $1 = el día a obtener (para el último domingo se pone Dom) y $2 siempre el formato

estoy seguro de que se puede hacer de forma recursiva además :)
0
francois
 
la sintaxis date X days ago no existe en todos los Linux, ni mucho menos en los Unix propietarios y tampoco en todos los BSD.

¡A proscribir para siempre como consecuencia!
Una de las soluciones simples:
expr `date +%d` - 1


y por supuesto, si queremos gestionar el mes y el año, hay que hacer un shellscript
que pruebe si el día es 0, entonces hacer cal del mes anterior para ver si termina en 28, 29, 30, 31, y si estamos en enero, hacer año -1.

No es nada más simple.
0
alibat
 
¡Genial! Nos salvas la vida.
0
tontonserver
 
Para el cálculo de la fecha a J-1, no hay que complicarse:
FECHA=$((`/bin/date +'%Y%m%d'` - 1))
Ahí, es para un formato AAAAMMDD, después, ¡hágalo a su manera!
@+
0
Goldmund
 
¡No funciona los primeros de mes!
0
uu
 
```bash #!/bin/ksh
#
set -A DÍAS Sáb Dom Lun Mar Mié Jue Vie Sáb
set -A MESES Dic Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic
set -A MES_ 12 01 02 03 04 05 06 07 08 09 10 11 12
set -A DÍAS_ 09 01 02 03 04 05 06 07 08 09
#
# funciona en Linux
#
# fecha -d '1 días atrás'
#
#AYER=$((`fecha +%d` -1))
fecha1=20070101
AYER=$((`fecha -d $fecha1 +%d` -1))
MES=`fecha -d $fecha1 '+%m' `
AÑO=`fecha -d $fecha1 '+%Y' `
NDÍA=`fecha -d $fecha1 '+%d' `

DÍA_SEMANA=${DÍAS[`fecha +%u`]}
#
if [ $AYER -eq "0" ];
then
#
MES=$((MES-1))
#
if [ $MES -eq "0" ];
then
#
MES=12
AÑO=$((AÑO-1))
#
fi
#
set `cal $MES ${AÑO}`
shift $(($# - 1))
AYER=$1
#
fi
#
AYER_=$AYER
if [ $AYER -ne "0" ];
then
if [ $AYER -le 9 ];
then
#
AYER_=${DÍAS_[AYER]}
#
fi
fi
#
TMES=${MESES[MES]}
T_MES=${MES_[MES]}
AÑO2=${AÑO##20}
#
# desbloquear la siguiente línea para depuración
#
echo ${DÍA_SEMANA} ${AYER} ${TMES} ${AÑO}
#
#echo ${AYER}${MES}${AÑO2}
#
fecha=${AÑO}${T_MES}${AYER_}
echo $fecha
# ```
0
ddark2002
 
Hola,

date=$(date)
set $date

date=$(date --date '1 días atrás')
set $datedate=$(date)
set $date

Me gustaría hacer un archivo con 2 variables de tiempo para hacer una comparación.
diff -c /home/file_.$2$3 /home/file_.$2$3-1d > /home/test.log
0
dallas
 

DTE=`date --date '24 horas atrás' '+%Y%m%d'`
0
BBH
 
```html Utilice las siguientes funciones:

function TimeToSecond {
# ${1} = Fecha y hora opcional (YYYYMMDDHHMMSS); por defecto, se utiliza la hora actual
( typeset -r awk_date="\"y=\" substr(\$1,01,4) \"\\nm=\" substr(\$1,05,2) \"\\nd=\" substr(\$1,07,2)"
typeset -r awk_time="\"h=\" substr(\$1,09,2) \"\\ni=\" substr(\$1,11,2) \"\\ns=\" substr(\$1,13,2)"
if [ -z "${1}" ]
then date +%Y%m%d%H%M%S
else echo "${1}"
fi |\
awk "{ print ${awk_date} \"\\n\" ${awk_time} }"
echo
echo "m += 9"
echo "if (m <= 11) {"
print "\ty -= 1 }"
echo "if (m > 11) {"
print "\tm -= 12 }"
print "(((((y-1)*1461+1)/4 - y/100 + y/400 + (m*153+2)/5 + d + 59)*24 + h)*60 + i)*60 + s")\
| bc
}

function SecondsToTime {
# ${1} = número de segundos desde el 1 de enero del año 0001
( echo "s = ${1}"
echo "i = s/60"
echo "s -= i*60"
echo "h = i/60"
echo "i -= h*60"
echo "d = h/24"
echo "h -= d*24"
echo "d += 305"
echo "b = d/146097"
echo "d -= b*146097"
echo "y = b*400"
echo "b = d/36524"
echo "if (b > 3) {"
print "\tb = 3 }"
echo "d -= b*36524"
echo "y += b*100"
echo "b = d/1461"
echo "d -= b*1461"
echo "y += b*4"
echo "b = d/365"
echo "if (b > 3) {"
print "\tb = 3 }"
echo "d -= b*365"
echo "y += b"
echo "m = (d*5+2)/153"
echo "d -= (m*153+2)/5-1"
echo "m += 3"
echo "if (m > 12) {"
print "\tm -= 12"
print "\ty += 1 }"
echo "y"
echo "m"
echo "d"
echo "h"
echo "i"
echo "s"
)\
| bc | paste -s - | awk '{ printf "%04d%02d%02d%02d%02d%02d\n",$1,$2,$3,$4,$5,$6 }'
} ```
0