¿Cómo comparar dos marcas de tiempo?

¿Cómo comparar dos marcas de tiempo?

Tengo dos marcas de tiempo, una es así 24MAR17:00:14:09y otra es así 2017-03-25 05:52:09.373941000y quiero comparar las dos marcas de tiempo iguales o no. Probé muchas funciones de fecha y función awk pero nada me dio resultados, por favor ayúdenme.

Respuesta1

intentosolución:

#!/bin/bash
d1='24MAR17:00:14:09'
d2='2017-03-25 05:52:09.373941000'

d1="$(sed -E 's/^([0-9]{2})([A-Z]{3})([0-9]{2}):/\1-\2-\3 /' <<< $d1)"

if [[ $(date -d "$d1") == $(date -d "$d2") ]]
then 
    echo "dates are equal"
else 
    echo "dates are unequal"
fi

Respuesta2

Prueba esto,

La hora 2017-03-25 05:52:09.373941000se puede convertir al primer formato 24MAR17:00:14:09y luego hacer una comparación.

date_in="24MAR17:00:14:09"
date_out=`date +%d%b%y:%H:%M:%S -d "2017-03-25 05:52:09.373941000" |  tr '[:lower:]' '[:upper:]'`
[ $date_in == $date_out ] && echo "The dates match"

Respuesta3

El principal problema es analizar las cadenas proporcionadas. La fecha del comando acepta solo algunos formatos, no todos. La solución es aprovechar la capacidad de fecha de Busybox de aceptar (casi)cualquierformato.

D1

  1. Cree una cadena de formato que imprima una fecha en el mismo formato proporcionado:

    $ date -u +'%d%b%y:%T'
    07Jul17:15:18:48
    
  2. Utilice esa cadena para indicarle a la fecha de Busybox cómo analizar la cadena de fecha. Tenga en cuenta que el TZ local puede cambiar el resultado; utilice -u (UTC) para evitar errores o asegúrese de configurar el TZ correcto para la cadena de tiempo que se va a analizar.

    $ d1='24MAR17:00:14:09'
    $ busybox date -u -D '%d%b%y:%T' -d "$d1"
    Fri Mar 24 00:14:09 UTC 2017
    
  3. Haga la fecha de la casilla ocupada para imprimir el valor en segundos (desde la época):

    $ busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s'
    1490314449
    

D2

Puedes repetir el procedimiento para la segunda marca de tiempo también, pero, en este caso, la cadena se entiende por fecha directamente:

$ d2='2017-03-25 05:52:09.373941000'
$ date -u -d "$d2" +'%s'
1490421129

Y fecha de Busybox eliminando los nanosegundos ( ${d2%.*}) (más sobre esto más adelante):

$ busybox date -u -d "${d2%.*}" +'%s'
1490421129

diferencia

Debería haber capturado los resultados anteriores en dos variables:

$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')"
$ resd2="$(date -u -d "$d2" +'%s')"

Luego, calcula la diferencia y compárala con cero:

$ (( resd1-resd2 )) && echo "Dates are different" || echo "Dates are equal"
Dates are different

O compare directamente las cadenas (no los valores):

$ [[ "$resd1" == "$resd2" ]] && echo "equal" || echo "different"
different

Nanosegundos

Hay tres cuestiones si es necesario comparar también nanosegundos.

  1. El primer valor no tiene nanosegundos. La primera es que la primera fecha no tiene el valor de nanosegundos.
    Puedes agregar 9 ceros:

    $ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')"
    $ resd1="$resd1""$(printf '%0*d' 9 0)"
    $ echo "$resd1"echo "$resd2 - $resd1"
    1490314449000000000
    

    O (mejor) volver a procesar el valor con la fecha:

    $ resd1="$(date -u -d "@$resd1" +'%s%N')"
    $ echo "$resd1"
    1490314449000000000
    
  2. La segunda fecha tiene nanosegundos. En este caso, la segunda fecha tiene un formato que la fecha podría procesar directamente, pero si tuviera un formato que requiriera procesamiento previo por fecha de ocupado, necesitaremos agregar los nanosegundos más tarde. Como ejemplo:

    $ d2='2017-03-25 05:52:09.373941000'
    $ resd2="$(busybox date -u -D '%Y-%m-%d %T' -d "$d2" +'%s')${d2##*.}"
    $ echo "$resd2"
    1490421129373941000
    
  3. Y el bash que está ejecutando debe poder procesar números enteros de 64 bits.
    Si es así, calcula la diferencia:

    $ echo "(( $resd2 - $resd1 ))"
    (( 1490421129373941000 - 1490314449000000000 ))
    
    $ echo "$(( $resd1 - $resd2 ))"
    106680373941000
    

    Lo cual es un poco más de 106 mil segundos (~29 horas):

    $ echo "$(( ($resd2 - $resd1)/10**9 ))"
    106680
    

información relacionada