
Tengo dos marcas de tiempo, una es así 24MAR17:00:14:09
y otra es así 2017-03-25 05:52:09.373941000
y 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.373941000
se puede convertir al primer formato 24MAR17:00:14:09
y 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
Cree una cadena de formato que imprima una fecha en el mismo formato proporcionado:
$ date -u +'%d%b%y:%T' 07Jul17:15:18:48
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
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.
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
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
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