Minutes, hours and days are considered “Non-SI units accepted for use with the International System of Units” (with standardized symbol and conversion factor 1min = 60s, 1h = 3600s and 1d = 86400s), which I think is fine. They are not in SI proper simply because they aren’t related to seconds by factors of 10n.
BTW, for easy tracking, we have rejected additions of Durations::from_{minutes, hours, days} previously because of confusion when a timezone change is involved,
// cargo-deps: chrono, chrono-tz
extern crate chrono;
extern crate chrono_tz;
use chrono::{Duration, TimeZone};
fn main() {
let eastern_time = chrono_tz::US::Eastern;
let datetime_1 = eastern_time.ymd(2018, 3, 11).and_hms(1, 59, 59);
let datetime_2 = eastern_time.ymd(2018, 3, 11).and_hms(3, 0, 0);
assert_eq!(datetime_2 - datetime_1, Duration::seconds(1));
}
I don’t think leap seconds is a blocking issue, chrono for instance simply treated hh:mm:60 as the same as hh:(mm+1):00.