Logo

Programming-Idioms

This language bar is your friend. Select your favorite languages!

Idiom #368 Parse a millisecond value

Parse the millisecond value a, to a collection of duration values, m.

For example, `1,000,000 ms` is `{min=16, sec=40}`.

https://en.wikipedia.org/wiki/Gregorian_calendar
https://en.wikipedia.org/wiki/Time

math
Type
   TT = record H, M, S, Ms: Integer; end;
   TTList = array of TT;
var
  t: TT;
  m: TTList;
  a: Integer;
begin
...
  divmod(a, MSecsPerSec*SecsPerHour, t.H, a);
  divmod(a, MSecsPerSec*SecsPerMin, t.M, a);
  divmod(a, MSecsPerSec, t.S, t.Ms);
  SetLength(m, Length(m)+1);
  m[High(m)] := t;
...
import static java.util.List.of;
import java.util.LinkedHashMap;
import java.util.Map;
enum Unit {
    ms(1), s(1_000 * ms.x), m(60 * s.x),
    h(60 * m.x), d(24 * h.x),
    y(365.2425 * d.x);
    double x;
    Unit(double x) { this.x = x; }
    static Map<Unit, Integer> parse(long ms) {
        Map m = new LinkedHashMap<>();
        double x = ms, y;
        for (Unit u : of(values()).reversed())
            if (x >= (y = u.x)) {
                m.put(u, (int) (x / y));
                x = x % y;
            }
        return m;
    }
}
Map<Unit, Integer> m = Unit.parse(a);

New implementation...
< >
reilas