Bash: вычитание 10 минут из заданного времени - PullRequest
8 голосов
/ 09 сентября 2010

В bash-скрипте, если у меня есть число, представляющее время, в форме hhmmss (или hmmss), каков наилучший способ вычитания 10 минут?

, т. Е. 90000 -> 85000

Ответы [ 4 ]

21 голосов
/ 09 сентября 2010

Это немного сложно.Date может выполнять общие манипуляции, т. Е. Вы можете делать:

date --date '-10 min'

Указание часов-минут-секунд (используя UTC, потому что в противном случае предполагается, что PM):

date --date '11:45:30 UTC -10 min'

Чтобы разделить вашстрока даты, единственное, о чем я могу думать, это расширение подстроки:

a=114530
date --date "${a:0:2}:${a:2:2}:${a:4:2} UTC -10 min"

И если вы хотите просто вернуть hhmmss:

date +%H%M%S --date "${a:0:2}:${a:2:2}:${a:4:2} UTC -10 min"
2 голосов
/ 09 сентября 2010

почему бы просто не использовать время эпохи, а затем снять с него 600?

$ 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
1 голос
/ 08 апреля 2013

Моя версия bash не поддерживает -d или --date, как указано выше. Тем не менее, при условии правильного ввода с 0 дополнением, это работает

$ 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.
1 голос
/ 17 сентября 2010

Так как у вас есть 5 или 6-значный номер, вы должны добавить его перед выполнением манипуляции со строкой:

$ 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

Обратите внимание, что --utc и UTC необходимычасовой пояс системы не влияет на результаты.

Для математики в bash (т. е. $(( и ((), ведущие нули приводят к тому, что число интерпретируется как восьмеричное.Тем не менее, ваши данные в любом случае более строковые (в специальном формате), чем числовые.Я использовал цикл while выше, потому что он звучит так, как будто вы рассматриваете его как число, и поэтому можете получить 100 за 0:01 утра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...