En un script bash, si tengo un número que representa un tiempo, en la forma hhmmss (o hmmss), ¿cuál es la mejor forma de restar 10 minutos?Bash: restando 10 minutos de un tiempo dado
es decir, 90000 -> 85000
En un script bash, si tengo un número que representa un tiempo, en la forma hhmmss (o hmmss), ¿cuál es la mejor forma de restar 10 minutos?Bash: restando 10 minutos de un tiempo dado
es decir, 90000 -> 85000
Esto es un poco complicado. La fecha se puede hacer manipulaciones generales, es decir, que puede hacer:
date --date '-10 min'
Especificación horas minutos-segundos (utilizando UTC, porque de lo contrario, parece asumir PM):
date --date '11:45:30 UTC -10 min'
Para dividir la cadena de la fecha, la única manera que puedo pensar es subcadena de expansión:
a=114530
date --date "${a:0:2}:${a:2:2}:${a:4:2} UTC -10 min"
Y si sólo quiere volver hhmmss:
date +%H%M%S --date "${a:0:2}:${a:2:2}:${a:4:2} UTC -10 min"
¿por qué no utilizar el tiempo de época y luego quitar 600 de él?
$ echo "`date +%s` - 600"| bc; date
1284050588
Thu Sep 9 11:53:08 CDT 2010
$ date -d '1970-01-01 UTC 1284050588 seconds' +"%Y-%m-%d %T %z"
2010-09-09 11:43:08 -0500
Gracias por la respuesta. La cuestión es que no necesito hacerlo en función de la hora actual. Se pasará un tiempo arbitrario en el script como un número de cinco o seis dígitos. –
Por lo general, es una buena idea tirar su propio estilo/características y usar un aviso convencional como "$" al publicar. (Configuré 'PS1 = '\ $'' antes de responder estas preguntas para poder copiar y pegar). –
Puesto que usted tiene un número de dígitos 5 o 6, hay que rellenarlo antes de hacer la manipulación de cadenas:
$ t=90100
$ while [ ${#t} -lt 6 ]; do t=0$t; done
$ echo $t
090100
$ date +%H%M%S --utc -d"today ${t:0:2}:${t:2:2}:${t:4:2} UTC - 10 minutes"
085100
Nota tanto --utc y UTC son necesarios para asegurarse de que el sistema de la zona horaria no afecta los resultados.
Para las matemáticas dentro de bash (es decir, $((
y ((
), los ceros a la izquierda harán que el número se interprete como octal. Sin embargo, sus datos son más parecidos a cadenas (con un formato especial) que a números, de todos modos. He usado un ciclo while arriba porque parece que lo estás tratando como un número y por lo tanto podría obtener 100 para las 12:01 a.m.
Mi versión de bash no admite -d ni --date como se usa arriba. Sin embargo, asumiendo una entrada correctamente acolchada, esto sí funciona
$ input_time=130503 # meaning "1:05:03 PM"
# next line calculates epoch seconds for today's date at stated time
$ epoch_seconds=$(date -jf '%H%M%S' $input_time '+%s')
# the 600 matches the OP's "subtract 10 minutes" spec. Note: Still relative to "today"
$ calculated_seconds=$((epoch_seconds - 600)) # bc would work here but $((...)) is builtin
# +%H%M%S formats the result same as input, but you can do what you like here
$ echo $(date -r $calculated_seconds '+%H%M%S')
# output is 125503: Note that the hour rolled back as expected.
Gracias por la respuesta. Entonces para aclarar ... el tiempo no es el tiempo presente ... es un número de cinco o seis dígitos pasado al script como parámetro ... ¿funcionaría este enfoque para esto? –
@RogerMoore sí, es por eso que uso --date. Debe escribirse como "hh: mm: ss UTC" porque de lo contrario la fecha no podrá malinterpretarlo, pero pareció funcionar para su propósito. No estoy seguro de lo que sucede cuando pasas el tiempo en forma de hh: mm: s, es mejor que lo pruebes, también alrededor de la medianoche y el mediodía. – wds