¿Calcular la fecha de hace 1125 días en sistemas que no son GNU?

En la línea de comandos de Unix Bash, quiero calcular la fecha de hace 1125 días usando el sistema operativo base (por ejemplo, No Perl o Python).

En sistemas que ejecutan GNU Date , puedo hacer algo como esto:

ubuntu $ date --date="1125 days ago" Wed Nov 7 15:12:33 PST 2007 

Los sistemas FreeBSD o MacOSX no se envían con GNU Date y no admiten valores como «hace X días».

freebsd81 $ date --date="+1125 days ago" date: illegal option -- - 

I puedo calcular una fecha de hace unos días en un sistema Mac o FreeBSD, pero esto está limitado a unos pocos días:

# Today is really Dec 6, 2010. 4 days ago it was: macosx $ TZ=GMT+96 date +%Y%m%d 20101202 # But that doesn"t work if I want to see the date 8 days ago: macosx $ TZ=GMT+192 date +%Y%m%d 20101206 

¿Puedo calcular fechas antiguas en sistemas que no son GNU sin profundizar en herramientas como Perl o Python? ¿O debo usar un lenguaje de secuencias de comandos más potente?

Respuesta

Bueno, puedes hacer algo astuto como:

 $ echo "`date +%s` - (1125 * 24 * 60 *60)" |bc 1194478815 $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 

Probado en OpenBSD (definitivamente una fecha no basada en gnu), y parece funcionar.

Desglosando en pasos:

  • obtener el tiempo unixt actual (segundos desde el comienzo de la época unix):
 $ date +%s 1291679934 
  • obtener el número de segundos en 1125 días
 $ echo "1125 * 24 * 60 *60" | bc 97200000 
  • restar uno del otro (1291679934 – 97200000) = 1194478815

  • utilice el nuevo unixtime (1194478815) para imprimir una fecha bonita

     $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 
  • Como alternativa, en solaris puede hacer esto para imprimir la fecha *:

    /bin/echo "0t1194478815>Y\n<Y=Y" |adb

* referenciada desde http://www.sun.com/bigadmin/shellme/

Además, una alternativa en Solaris para obtener la marca de tiempo actual del comando date ** es:

/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= "/^time()/ {gsub(/ /,"",$2);print $2}"

** referenciado de http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris

Comentarios

  • Tenga en cuenta que %s y date -r son BSDisms (desde los primeros días, por lo que ‘ re en todas las plataformas BSD). No ‘ no espere verlos en plataformas System V (por ejemplo, Solaris no tiene ninguna).
  • Ah, Solaris, cuánto te amo … (;
  • @Gilles: ¿Estás seguro? Solaris tiene una multitud de directorios bin, como / usr / ucb / bin, que contienen versiones de otras variaciones de Unix. Después de todo, SunOS 4.X estaba basado en BSD.
  • Esto falla cuando cualquiera de los días intermedios tiene más o menos de 60 * 60 * 24 segundos, como los segundos intercalares y los cambios de calendario.
  • @Sparr: Buen punto. Un seguro El método consiste en restar la hora del día actual de la fecha absoluta actual y sumar 12 * 60 * 60. Esto devuelve una hora del día entre las 10:59 y las 13:01. Sumando períodos de 24 horas a esto y obteniendo el la fecha correspondiente es segura.

Respuesta

La respuesta anterior era demasiado complicada. FreeBSD / macOS tienen el -v marca para date, de la página MAN (descripción abreviada):

Ajustar (es decir, tomar la fecha actual y mostrar el resultado del ajuste; en realidad no establece la fecha) el segundo, minuto, hora, día del mes, día de la semana, mes o año según val. Si val está precedido por un signo más o menos, la fecha se ajusta hacia adelante o hacia atrás de acuerdo con la cadena restante; de lo contrario, se establece la parte relevante de la fecha. La fecha se puede ajustar tantas veces como sea necesario utilizando estos indicadores. Las banderas se procesan en el orden indicado.

Entonces, para su propósito, date -v1125d simplemente hará lo que necesite

$ date; date -v-1125d Thu 19 Oct 2017 11:35:25 EDT Sat 20 Sep 2014 11:35:25 EDT 

Respuesta

Estaba teniendo un problema similar y encontré el dateutils pkg para OpenBSD 6.4. Fue un simple pkg_add dateutils para mí.

#!/bin/ksh # Using dateutils dadd (get current date) -1month -f (format to strftime) # Set Year in YYYY formant y is YY format lastMonth=$(dadd date -1mo -f "%Y.%m") echo $lastMonth mkdir /home/$usr/History/$lastMonth 

Mi salida aquí es

#2018.11 

ACTUALIZACIÓN 1

Estoy ejecutando este comando en 2018.12.10

HostNameHere# dadd date -1125d -f "%Y.%m" 

Resultado

 2015.11 

Admite sumas o restas en cualquier momento que yo sepa. Aquí están los comandos que ayudan a imprimir. #dadd -h (esta no es la totalidad de la impresión. Hay más información sobre las opciones.

 Usage: dadd [OPTION]... [DATE/TIME] [DURATION] Add DURATION to DATE/TIME and print the result. If DATE/TIME is omitted but DURATION is given, read a list of DATE/TIMEs from stdin. If DURATION is omitted but DATE/TIME is given, read a list of DURATIONs from stdin. Durations are specified as nY, nMO, nW, or nD for years, months, weeks, or days respectively, or nH, nM, nS for hours, minutes, and seconds, where N is a (possibly negative) number. The unit symbols can be written lower-case as well (y, mo, w, d, h, m, s) and the unit symbol `d" can be omitted. Note that duration addition is not commutative! 2000-03-30 +1mo +1d -> 2000-05-01 2000-03-30 +1d +1mo -> 2000-04-30 

Aquí están los comandos.

Aquí están las opciones de formato.

Comentarios

  • (1) Es ‘ bueno que este programa admita -1mo. ¿Puede demostrar que le permite al usuario calcular la fecha de hace 1125 días, como dice la pregunta? (2) La pregunta dice » usando la base sistema operativo (por ejemplo, Sin Perl o Python). » Eso parecería excluir la adición de un nuevo paquete.
  • @ G-Man Gracias por el comentario. Soy nuevo en contribuir en StackExchange. Gracias por la ayuda. Ver ACTUALIZACIÓN 1

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *