"So, I could make a custom..." <- in general, my approach when I see a primitive type, is to wrap it. Even for a simple toy project, I'll wrap a `u32` and use `Seconds(u32)` (probably pub it as well). It does a few things: - Self documuments: there is no longer any ambiguity about what information this value is capturing - Mitigates/prevents variable misuse. When something seeds seconds, i can't confuse it with a u32 that was used to store millisecond information, or age information, or whatever. - Control over behavior. a raw primitive can do everything. The type you want to wrap, you might not want it to be divisible, for example. My personal rule of thumb is "If in doubt, wrap the type", but usually the line is when a values thread-of-logic extends beyond a typical scope of working memory, or between use contexts. For the concept of time, I feel type-wrapping is very valuable. I like what fugit does with theirs: ```rust /// Alias for nanosecond duration pub type NanosDuration = Duration; /// Alias for nanosecond duration (`u32` backing storage) pub type NanosDurationU32 = Duration; /// Alias for nanosecond duration (`u64` backing storage) pub type NanosDurationU64 = Duration; /// Alias for microsecond duration pub type MicrosDuration = Duration; ``` ...it has aliases for u32 and u64 and for most/all common scales.