saturating-time
A trait for limits and saturations on types inside [std::time].
- Easy:
saturating-timeonly adds a single trait, [SaturatingTime] that is implemented for various types from the standard library. - Future-Proof: In the case that [
SaturatingTime::saturating_add()] and [SaturatingTime::saturating_sub()] become a part of the standard library, developers would only have to remove theuse saturating_time::SaturatingTimeline from their code.[^1] [^2]. - Portable: The algorithm for determining the limits is portable across operating systems: enjoy this crate from Windows, Darwin, and Linux, across the BSD systems, up to exotic ones such as Hermit OS and Redox.
- Secure: This crate does not make any use of
unsafeRust code.
Overview
saturating-time is a very minimal crate that only exposes a minimal trait:
[SaturatingTime].
The trait itself offers the following methods:
- [
SaturatingTime::max_value()] – Returns the maximum value for this type. - [
SaturatingTime::min_value()] – Returns the minimum value for this type. - [
SaturatingTime::saturating_add()] – Saturating addition for this type. - [
SaturatingTime::saturating_sub()] – Saturating subtraction for this type. - [
SaturatingTime::saturating_duration_since()] - Saturating time deltas for this type.
This trait is sealed, meaning applications may not implement it themselves. However, this crate implements this trait for two structures:
- [
std::time::Instant] - [
std::time::SystemTime]
Example
Add the following to your Cargo.toml:
[]
= "0.4.0"
If you use Rust nightly, you may want to do:
[]
= { = "0.4.0", = ["nightly"] }
Now, you can use saturating-time in your code:
use ;
use SaturatingTime;
// Get the maximum and minimum.
let max = max_value;
let min = min_value;
assert_eq!;
assert_eq!;
assert!;
Standardization Efforts
The eventual goal is to get this functionality into the Rust standard library.
SystemTime
SystemTime::MIN and SystemTime::MAX
In December 2025, SystemTime::MIN and SystemTime::MAX got merged
into nightly.[^3]
This feature is guarded behind time_systemtime_limits and a tracking
issue regarding the stabilization of it exists.[^4]
SystemTime::saturating_add(), et, al.
In January 2025, SystemTime::saturating_add(), SystemTime::saturating_sub(),
and SystemTime::saturating_duration_since() got merged into nightly.[^5]
This feature is guarded behind time_saturating_systemtime and a tracking
issue regarding the stabilization of it exists.[^6]
Instant
None yet.
[^1]: This is an effort the maintainers are actively working upon.
[^2]: Assuming the name, signature, and behavior does not change.
Unfortunately, we likely have to change the signature for the parameters
because we currently use self whereas the standard library uses &self.
It should not be a big problem though, because both Instant and
SystemTime implement Copy.
[^3]: https://github.com/rust-lang/rust/pull/149979
[^4]: https://github.com/rust-lang/rust/issues/149067
[^5]: https://github.com/rust-lang/rust/pull/151200
[^6]: https://github.com/rust-lang/rust/issues/151199
License and Copyright
This crate is licensed under MIT OR Apache-2.0.
See the respective LICENSE-* files in the repository for more information.