Converting units of time deltas

Let’s say I want to get the fractional hours elapsed between two times. I often have code that looks something like

function hours_elapsed(start, stop)
    millis = (stop - start).value
    return millis / (1000 * 60 * 60)

This seems nasty for two reasons:

  • Trusting start - stop to return a Millisecond and not some other period type seems dangerous. Maybe start and stop are some other datetime-like type where subtraction returns a Second, not a Millisecond.
  • The above snippet is quite a mouthful.

What’s the preferred way to convert some elapsed time to a fractional number of time units?

You can use Millisecond(stop-start) to be sure you have milliseconds. But that will fail if the period is not an integer number of milliseconds. Safer would be to use

function hours_elapsed(start, stop)
    nanos = Nanosecond(stop - start)
    return Dates.value(nanos) * 1e-9 / 3600

though maybe not optimal for precision? (and no less of a mouthful than your example)

1 Like

Couldn’t you use the functions: Dates.datetime2epochms and Dates.epochms2datetime ?

using Dates
stop = now()
start = now() - Minute(90)
round((stop - start), Minute)/Minute(60)

For comparisons,

round((stop - start), Minute)/Minute(60) < 2*Minute(60).value


This is perhaps more a Dates.jl design question, but is there any reason Dates.jl cannot be extended to support fractional hours via e.g. Hour{Float64}. Currently,

julia> Hour{Float64}
ERROR: TypeError: in Type{...} expression, expected UnionAll, got Type{Hour}
 [1] top-level scope
   @ REPL[13]:1

Just curious how the community feels about something like this?

1 Like