2010-09-09 9 views

Respuesta

13

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" 
+0

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? –

+0

@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

1

¿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 
+0

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. –

+1

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). –

1

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.

1

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. 
Cuestiones relacionadas