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




Public Sub Main()
Dim iInput As Integer[] = [7259, 86400, 6000000]                                  'Input details
Dim iChecks As Integer[] = [604800, 86400, 3600, 60]                              'Weeks, days, hours, mins in seconds
Dim iTime As New Integer[5]                                                       'To store wk, d, hr, min & sec
Dim iOriginal, iSec, iLoop As Integer                                             'Various integers
Dim sOrd As String[] = [" wk", " d", " hr", " min", " sec"]                       'To add to the output string
Dim sOutput As String                                                             'Output string
 
For Each iSec In iInput                                                           'For each iInput
  iOriginal = iSec                                                                'Store orginal value in seconds
  iTime[4] = iSec                                                                 'Store seconds in iTime[4]
 
  For iLoop = 0 To 3                                                              'Loop through wk, d, hr, min & sec
    If iTime[4] >= iChecks[iLoop] Then                                            'Check if value is = to wk, d, hr, min
      iTime[iLoop] = Int(iTime[4] / iChecks[iLoop])                               'Put the correct value for wk, d, hr, min in iTime
      iTime[4] = iTime[4] - (iTime[iLoop] * iChecks[iLoop])                       'Remove the amount of seconds for wk, d, hr, min from iTime[4]
    Endif
  Next
 
  For iLoop = 0 To 4                                                              'Loop through wk, d, hr, min & secs
    If iTime[iLoop] > 0 Then sOutput &= ", " & Str(iTime[iLoop]) & sOrd[iLoop]    'Add comma and ordinal as needed
  Next
 
  If Left(sOutput, 2) = ", " Then sOutput = Mid(sOutput, 3)                       'Remove unnecessary ", "
  sOutput = Format(Str(iOriginal), "#######") & " Seconds = " & sOutput           'Add original seconds to the output string
  Print sOutput                                                                   'Print sOutput string
  sOutput = ""                                                                    'Clear the sOutput string
  iTime = New Integer[5]                                                          'Reset iTime[]
Next
 
End