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

  1. 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
  2. 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
    1. 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
    2. ZdraL
       
      Super, eso funciona, ¡muchas gracias! =)
      0
  3. 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
    1. skea
       
      Gracias slamagirand, ¡está perfecto!
      0
  4. 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
    1. jebok Mensajes publicados 371 Fecha de registro   Estado Miembro 51
       
      no, no funciona...

      --
      Gracias por su ayuda
      0
  5. 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
  6. [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
  7. 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
    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
  8. 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
    1. alibat
       
      ¡Genial! Nos salvas la vida.
      0
  9. 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
    1. Goldmund
       
      ¡No funciona los primeros de mes!
      0
  10. 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
  11. 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
    1. dallas
       

      DTE=`date --date '24 horas atrás' '+%Y%m%d'`
      0
    2. 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