PSYDUCK
PSYDUCK

Reputation: 116

Need to generate time values between two given times in bash

So I'm new to bash and I have to make a script that include dynamically echoing lines with changing timestamps HH:MM. So when I give say

sh run.sh 03:40 05:40

It should echo all the times between the given range Ex: 03:31 03:32 ........ 05:39 05:40

I know it really simple with loops but I'm not able to figure it out.Any Help?

I have this not so good code which doesnt work as of now.

echo "Enter from Hour:"
read fromhr
echo "Enter from Min:"
read frommin
echo "Enter to Hour:"
read tohr
echo "Enter to Min:"
read tomin
while [  $fromhr -le $tohr ]; do
    while [  $frommin -le $tomin ]; do
        echo "$fromhr:$frommin"
        if [ $frommin -eq 60 ]; then
            frommin=0
            break
        fi
        ((frommin++))
    done
    if [ $fromhr -eq 24 ]; then
        fromhr=0
    fi
    ((fromhr++))
done

Upvotes: 1

Views: 340

Answers (3)

Bach Lien
Bach Lien

Reputation: 1060

Example 1: Use bash only, faster:

#!/bin/bash
                     # - input data
fh=03                #   from hour
th=05                #   to hour
fm=30                #   from minute
tm=30                #   to minute
 
for ((h=fh;h<=th;h++)); do
  for ((m=0;m<=59;m++)); do
    [[ $h -le $fh && $m -lt $fm ]] && continue
    [[ $h -ge $th && $m -gt $tm ]] && break
    printf '%02d:%02d\n' $h $m
  done
done

Example 2: use date to convert back and forth, shorter code, but much slower:

#!/bin/bash
                              # 1) input data
ft='03:30'                    #    from time
tt='05:30'                    #    to time
                              # 2) convert to Epochtime (second)
f=`date +%s -d "$ft"`         #    from
t=`date +%s -d "$tt"`         #    to
 
for ((s=f;s<=t;s+=60)); do    # 60 seconds = 1 minute
  date +%H:%M -d @$s          # convert from Epochtime to H:M
done

Upvotes: 1

stackoverflow
stackoverflow

Reputation: 39

Sample code:

#!/bin/bash

# Convert the given start/end time to seconds
# Replace time string with required HH:MM value
start_t=`date -d "03:30" +%s`
end_t=`date -d "03:33" +%s`

while [ ${start_t} -le ${end_t} ]; do
    # Print time in HH:MM format
    date -d @${start_t} +"%H:%M"

    # Increment minute part
    start_t=$(expr ${start_t} + 60)
done

Upvotes: 0

bipll
bipll

Reputation: 11950

Note that if you're comparing that from is less than to, you're unlikely to ever reach the hour/date change. Say, iterating from 20:00 to 05:00 won't even happen; and if you iterate from 12:38 to 17:12, there won't be any minutes changed (the inner loop's condition is instantly false). Few steps are suggested.

  1. Change each condition's operator to -ne' rather than-le'.

  2. Move both increments (frommin++ and fromhr++) BEFORE the respective overflow checks (otherwise you will constantly see 24 hours and 60 minutes in the output).

Try this and see if you want to beautify it even more.

Upvotes: 0

Related Questions