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




Proc _CompoundDuration(7259)
Proc _CompoundDuration(86400)
Proc _CompoundDuration(6000000)
 
End
 
 
_CompoundDuration Param(1)             ' Print compound seconds
  a@ = FUNC(_Compound(a@, 604800, _wk))
  a@ = FUNC(_Compound(a@, 86400, _d))
  a@ = FUNC(_Compound(a@, 3600, _hr))
  a@ = FUNC(_Compound(a@, 60, _min))
 
  If a@ > 0 Then Print a@;" sec";      ' Still seconds left to print?
  Print
Return
 
 
_Compound Param(3)
  Local(1)
 
  d@ = a@/b@                           ' Get main component
  a@ = a@%b@                           ' Leave the rest
 
  If d@ > 0 Then                       ' Print the component
    Print d@;
    Proc c@
 
    If a@ > 0 Then
      Print ", ";                      ' If something follows, take
    EndIf                              ' care of the comma
  EndIf
Return (a@)
 
 
_wk  Print " wk";  : Return
_d   Print " d";   : Return
_hr  Print " hr";  : Return
_min Print " min"; : Return