简体   繁体   中英

Incrementing time (minutes and seconds) in bash / shell script

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.

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 - ie, 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
$

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM