Publi

Cómo convertir una cantidad de segundos a horas, minutos y segundos en Bash

photo-1415604934674-561df9abf539

El título del post lo dice claro. Imaginemos que tenemos un número grande, por ejemplo 58492, y que ese número son los segundos que ha tardado una tarea en realizarse, o el tiempo que ha pasado desde un evento determinado, pero a nosotros como humanos, este número no nos dice nada, lo entenderíamos mejor si lo expresamos como 16:14:52 como en todo, tenemos varias formas de hacerlo y voy a proponer dos.

Usando el comando date

La primera de ellas, me viene a la cabeza como más sencilla, ya que el mismo comando se encarga de hacaerlo, sólo tenemos que formatear la información de la manera debida. Por ejemplo:

$ date -u +%H:%M:%S –date=’@58492′

En este caso, le estamos diciendo que trabaje en GMT (-u), con esto, nos ahorramos que transforme la hora a la zona horaria en la que estamos actualmente, ya que puede variar el tiempo, y como estamos hablando de tiempo transcurrido, esto no depende de la zona horaria. Luego le pasamos el formato de salida con +”Formato” diciéndole cómo queremos que exprese la salida. Y por último la cantidad de segundos, precedido de arroba (@) para indicar que sólo son segundos.

Así podemos hacer también lo siguiente:

$ date -u +”%H horas, %M minutos y %S segundos” –date=’@58492′
16 horas, 14 minutos y 52 segundos

Aunque quedaría un poco raro cuando diga 1 horas, 0 minutos y 0 segundos en lugar de 1 hora. Eso sería mucho más elaborado, implicaría parsear la salida de date (con awk por ejemplo) y sería más trabajoso.

Una función para Bash

Pero también nos podemos crear una función específica para esto. Al fin y al cabo, se trata de hacer divisiones sobre la cantidad de segundos y desde hace años, Bash es muy bueno en matemáticas (si le pasamos la entrada como se la tenemos que pasar, y no le decimos nada raro.

1
2
3
4
5
6
7
8
function seconds_to_time()
{
    local TIME="$1"
    local h=$(($TIME/3600))
    local m=$((($TIME%3600)/60))
    local s=$(($TIME%60))
    printf "%02d:%02d:%02d\n" $h $m $s
}

Y luego la llamamos así:

$ seconds_to_time 58492
16:14:52

Lo malo, es que la función es específica para esto, y no hará nada extra (como hace time). Lo bueno es que podemos personalizar la salida como queramos (podemos meter sentencias condicionales para crear una salida compleja tipo “1 hora y 14 minutos”. Además, llamar a esta función es mucho más rápido que hacerlo con date. Sólo decir que date implica una ejecución que es lento (carga en memoria, creación de proceso, cambios de contexto, etc, mientras que con la función no hay que hacer nada de eso, ya que no salimos del mismo proceso Bash que se encarga de interpretarlo. Además, tanto las operaciones matemáticas como printf son órdenes internas de Bash.

Foto principal: Ales Krivec

También podría interesarte....

Leave a Reply