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




 
import std.stdio, std.conv, std.algorithm;
 
immutable uint SECSPERWEEK = 604_800;
immutable uint SECSPERDAY = 86_400;
immutable uint SECSPERHOUR = 3_600;
immutable uint SECSPERMIN = 60;
 
string ConvertSeconds(in uint seconds)
{
    uint rem = seconds;
 
    uint weeks = rem / SECSPERWEEK;
    rem %= SECSPERWEEK;
    uint days = rem / SECSPERDAY;
    rem %= SECSPERDAY;
    uint hours = rem / SECSPERHOUR;
    rem %= SECSPERHOUR;
    uint mins = rem / SECSPERMIN;
    rem %= SECSPERMIN;
 
    string formatted = "";
 
    (weeks != 0) ? formatted ~= (weeks.to!string ~ " wk, ") : formatted;
    (days != 0) ? formatted ~= (days.to!string ~ " d, ") : formatted;
    (hours != 0) ? formatted ~= (hours.to!string ~ " hr, ") : formatted;
    (mins != 0) ? formatted ~= (mins.to!string ~ " min, ") : formatted;
    (rem != 0) ? formatted ~= (rem.to!string ~ " sec") : formatted;
 
    if (formatted.endsWith(", ")) return formatted[0..$-2];
 
    return formatted;
}
 
void main()
{
    7_259.ConvertSeconds.writeln;
    86_400.ConvertSeconds.writeln;
    6_000_000.ConvertSeconds.writeln;
}
 