Incrementing time (minutes and seconds) in bash /

2019-06-20 02:39发布

I need to increment minutes and seconds (in relation to time) in a variable.

First, I'm not sure whether declaring a 'time' variable is written as

time="00:00:00" 

or

 time=$(date +00:00:00)?

From there, I want to increment this variable by 10 minutes and seconds resulting in

01:00:00 increased to
01:10:10 to
01:20:20 etc (all the way up to midnight - 00:00:00)

What would be the best way to achieve this?

I understand that doing $ date -d "2010-07-07 200 days" adds (200) days but I don't know how to apply this example to time (minutes and seconds) and not date?

All replies are much appreciated.

标签: bash time shell
2条回答
疯言疯语
2楼-- · 2019-06-20 02:44

The date command is not part of bash. It's provided by your operating system, and its behaviour differs in different operating systems. Notably, GNU coreutils date (in most Linux distros) has a -d option used for interpreting source dates, whereas BSD date has a -f option for interpreting specifically formatted input dates and a -v option for adjusting times by various units.

You've already got an accepted answer for the Linux option. To be complete about this, here's a BSD (and macOS) option:

$ for (( s=0; s<86400; s+=610 )); do date -j -v+${s}S -f '%H:%M:%S' "$time" '+%T'; done | head -5
00:00:00
00:10:10
00:20:20
00:30:30
00:40:40

Output here is obviously trimmed to 5 lines.

Of course, this is still platform-specific. If you want something that will work with bash anywhere, then as long as you're using bash >4.2, the following might do:

$ offset=$(printf '%(%z)T\n' 0)
$ for (( s=$(( ${offset:1:2}*3600 + ${offset:3}*60 )); s<86400; s+=610 )); do printf '%(%T)T\n' "$s"; done | head -5
00:00:00
00:10:10
00:20:20
00:30:30
00:40:40

The $offset variable allows us to compensate for the fact that you may not be in UTC. :) Like the date solution, this steps through increments of 610 seconds, but it uses printf's %T format to generate output. You may with to add or subtract the timezone offset to the 86400 end point to get a full day of times. Handling that is left as an exercise for the reader. :-)

查看更多
相关推荐>>
3楼-- · 2019-06-20 02:57

Note that this is Linux only. date -d on BSD unixes (and possibly others) does something significantly different (and untoward).

You could use epoch time - i.e., seconds since 1 Jan 1970 00:00:00, for example:

#!/bin/bash

time=0
echo `date -d "1970-01-01 00:00:00 UTC $time seconds" +"%H:%M:%S"`
time=$((time + 600))
echo `date -d "1970-01-01 00:00:00 UTC $time seconds" +"%H:%M:%S"`
time=$((time + 600))
echo `date -d "1970-01-01 00:00:00 UTC $time seconds" +"%H:%M:%S"`

gives this output:

$ /tmp/datetest.sh
00:00:00
00:10:00
00:20:00
$
查看更多
登录 后发表回答