Fecha de ayer
Resuelto
jebok
Mensajes publicados
371
Fecha de registro
Estado
Miembro
-
alibat -
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
¿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
Ben si ça marche, la preuve :
--
Z'@+...che.
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.
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
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
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
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
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}
#
#!/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}
#
Ver aquí : http://www.commentcamarche.net/forum/affich-1712417#1
Z'@+...che.
Z'@+...che.
JP : ¡Zen, mis Nuggets! ;-) El conocimiento solo es bueno si se comparte.
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 ....
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
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
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...
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...
¡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 :)
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 :)
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:
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.
¡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.
```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
# ```
#
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
# ```
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
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
```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 }'
} ```
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 }'
} ```
http://www.commentcamarche.net/forum/affich-1712417#1
el mensaje de error que obtengo...
--
Gracias por tu ayuda