Task

Write a function or program which:

   takes a positive integer representing a duration in seconds as input (e.g., 100), and
   returns a string which shows the same duration decomposed into:
   weeks,
   days, 
   hours, 
   minutes,   and 
   seconds.
This is detailed below (e.g., "2 hr, 59 sec").



Demonstrate that it passes the following three test-cases:

Test Cases


 input number

 output string


 7259

 2 hr, 59 sec


 86400

 1 d


 6000000

 9 wk, 6 d, 10 hr, 40 min

Details
The following five units should be used:



 unit

 suffix used in output

 conversion


 week

 wk

 1 week = 7 days


 day

 d

 1 day = 24 hours


 hour

 hr

 1 hour = 60 minutes


 minute

 min

 1 minute = 60 seconds


 second

 sec



However, only include quantities with non-zero values in the output (e.g., return "1 d" and not "0 wk, 1 d, 0 hr, 0 min, 0 sec").

Give larger units precedence over smaller ones as much as possible (e.g., return 2 min, 10 sec and not 1 min, 70 sec or 130 sec)

Mimic the formatting shown in the test-cases (quantities sorted from largest unit to smallest and separated by comma+space; value and unit of each quantity separated by space).




 
# syntax: GAWK -f CONVERT_SECONDS_TO_COMPOUND_DURATION.AWK
BEGIN {
    n = split("7259 86400 6000000 0 1 60 3600 604799 604800 694861",arr," ")
    for (i=1; i<=n; i++) {
      printf("%9s %s\n",arr[i],howlong(arr[i]))
    }
    exit(0)
}
function howlong(seconds,  n_day,n_hour,n_min,n_sec,n_week,str,x) {
    if (seconds >= (x = 60*60*24*7)) {
      n_week = int(seconds / x)
      seconds = seconds % x
    }
    if (seconds >= (x = 60*60*24)) {
      n_day = int(seconds / x)
      seconds = seconds % x
    }
    if (seconds >= (x = 60*60)) {
      n_hour = int(seconds / x)
      seconds = seconds % x
    }
    if (seconds >= (x = 60)) {
      n_min = int(seconds / x)
      seconds = seconds % x
    }
    n_sec = int(seconds)
    str = (n_week > 0) ? (str n_week " wk, ") : str
    str = (n_day > 0) ? (str n_day " d, ") : str
    str = (n_hour > 0) ? (str n_hour " hr, ") : str
    str = (n_min > 0) ? (str n_min " min, ") : str
    str = (n_sec > 0) ? (str n_sec " sec") : str
    sub(/, $/,"",str)
    return(str)
}
 