Bash: calculate the time elapsed between two timestamps

I have written a script that notifies me when a value is not within a given range. All values “out of range” are logged in a set of per day files.

Every line is timestamped in a proprietary reverse way:
yyyymmddHHMMSS

Now, I would like to refine the script, and receive notifications just when at least 60 minutes are passed since the last notification for the given out of range value.

I already solved the issue to print the logs in reverse ordered way with:

for i in $(ls -t /var/log/logfolder/*); do zcat $i|tac|grep !!!|grep --color KEYFORVALUE; done

that results in:

...
20170817041001 - WARNING: KEYFORVALUE=252.36 is not between 225 and 245 (!!!)
20170817040001 - WARNING: KEYFORVALUE=254.35 is not between 225 and 245 (!!!)
20170817035001 - WARNING: KEYFORVALUE=254.55 is not between 225 and 245 (!!!)
20170817034001 - WARNING: KEYFORVALUE=254.58 is not between 225 and 245 (!!!)
20170817033001 - WARNING: KEYFORVALUE=255.32 is not between 225 and 245 (!!!)
20170817032001 - WARNING: KEYFORVALUE=254.99 is not between 225 and 245 (!!!)
20170817031001 - WARNING: KEYFORVALUE=255.95 is not between 225 and 245 (!!!)
20170817030001 - WARNING: KEYFORVALUE=255.43 is not between 225 and 245 (!!!)
20170817025001 - WARNING: KEYFORVALUE=255.26 is not between 225 and 245 (!!!)
20170817024001 - WARNING: KEYFORVALUE=255.42 is not between 225 and 245 (!!!)
20170817012001 - WARNING: KEYFORVALUE=252.04 is not between 225 and 245 (!!!)
...

Anyway, I’m stuck at calculating the number of seconds between two of those timestamps, for instance:

20170817040001
20160312000101

What should I do in order to calculate the time elapsed between two timestamps?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

This will give you the date in seconds (since the UNIX epoch)

date --date '2017-08-17 04:00:01' +%s    # "1502938801"

And this will give you the date as a readable string from a number of seconds

date --date '@1502938801'    # "17 Aug 2017 04:00:01"

So all that’s needed is to convert your date/timestamp into a format that GNU date can understand, use maths to determine the difference, and output the result

datetime1=20170817040001
datetime2=20160312000101

# bash string manipulation
datestamp1="${datetime1:0:4}-${datetime1:4:2}-${datetime1:6:2} ${datetime1:8:2}:${datetime1:10:2}:${datetime1:12:2}"
datestamp2="${datetime2:0:4}-${datetime2:4:2}-${datetime2:6:2} ${datetime2:8:2}:${datetime2:10:2}:${datetime2:12:2}"

# otherwise use sed
# datestamp1=$(echo "$datetime1" | sed -nr 's/(....)(..)(..)(..)(..)(..)/1-2-3 4:5:6/p')
# datestamp2=$(echo "$datetime2" | sed -nr 's/(....)(..)(..)(..)(..)(..)/1-2-3 4:5:6/p')

seconds1=$(date --date "$datestamp1" +%s)
seconds2=$(date --date "$datestamp2" +%s)

delta=$((seconds1 - seconds2))
echo "$delta seconds"    # "45197940 seconds"

We’ve not provided timezone information here so it assumes local timezone. Your values for the seconds from the datetime will probably be different to mine. (If your values are UTC then you can use date --utc.)

Method 2

This is easy with datediff command provided in dateutils package.

ddiff -i '%Y%m%d%H%M%S' 20170817040001 20160312000101

Method 3

Use the expr command, like:

expr 20170817040001 - 20160312000101

Then you have difference between two values in seconds:

expr 20170817040001 - 20160312000101
10505039900


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x