|  | //! Temporal quantification. | 
|  | //! | 
|  | //! # Examples | 
|  | //! | 
|  | //! There are multiple ways to create a new [`Duration`]: | 
|  | //! | 
|  | //! ``` | 
|  | //! # use std::time::Duration; | 
|  | //! let five_seconds = Duration::from_secs(5); | 
|  | //! assert_eq!(five_seconds, Duration::from_millis(5_000)); | 
|  | //! assert_eq!(five_seconds, Duration::from_micros(5_000_000)); | 
|  | //! assert_eq!(five_seconds, Duration::from_nanos(5_000_000_000)); | 
|  | //! | 
|  | //! let ten_seconds = Duration::from_secs(10); | 
|  | //! let seven_nanos = Duration::from_nanos(7); | 
|  | //! let total = ten_seconds + seven_nanos; | 
|  | //! assert_eq!(total, Duration::new(10, 7)); | 
|  | //! ``` | 
|  | //! | 
|  | //! Using [`Instant`] to calculate how long a function took to run: | 
|  | //! | 
|  | //! ```ignore (incomplete) | 
|  | //! let now = Instant::now(); | 
|  | //! | 
|  | //! // Calling a slow function, it may take a while | 
|  | //! slow_function(); | 
|  | //! | 
|  | //! let elapsed_time = now.elapsed(); | 
|  | //! println!("Running slow_function() took {} seconds.", elapsed_time.as_secs()); | 
|  | //! ``` | 
|  |  | 
|  | #![stable(feature = "time", since = "1.3.0")] | 
|  |  | 
|  | #[stable(feature = "time", since = "1.3.0")] | 
|  | pub use core::time::Duration; | 
|  | #[stable(feature = "duration_checked_float", since = "1.66.0")] | 
|  | pub use core::time::TryFromFloatSecsError; | 
|  |  | 
|  | use crate::error::Error; | 
|  | use crate::fmt; | 
|  | use crate::ops::{Add, AddAssign, Sub, SubAssign}; | 
|  | use crate::sys::time; | 
|  | use crate::sys_common::{FromInner, IntoInner}; | 
|  |  | 
|  | /// A measurement of a monotonically nondecreasing clock. | 
|  | /// Opaque and useful only with [`Duration`]. | 
|  | /// | 
|  | /// Instants are always guaranteed, barring [platform bugs], to be no less than any previously | 
|  | /// measured instant when created, and are often useful for tasks such as measuring | 
|  | /// benchmarks or timing how long an operation takes. | 
|  | /// | 
|  | /// Note, however, that instants are **not** guaranteed to be **steady**. In other | 
|  | /// words, each tick of the underlying clock might not be the same length (e.g. | 
|  | /// some seconds may be longer than others). An instant may jump forwards or | 
|  | /// experience time dilation (slow down or speed up), but it will never go | 
|  | /// backwards. | 
|  | /// As part of this non-guarantee it is also not specified whether system suspends count as | 
|  | /// elapsed time or not. The behavior varies across platforms and Rust versions. | 
|  | /// | 
|  | /// Instants are opaque types that can only be compared to one another. There is | 
|  | /// no method to get "the number of seconds" from an instant. Instead, it only | 
|  | /// allows measuring the duration between two instants (or comparing two | 
|  | /// instants). | 
|  | /// | 
|  | /// The size of an `Instant` struct may vary depending on the target operating | 
|  | /// system. | 
|  | /// | 
|  | /// Example: | 
|  | /// | 
|  | /// ```no_run | 
|  | /// use std::time::{Duration, Instant}; | 
|  | /// use std::thread::sleep; | 
|  | /// | 
|  | /// fn main() { | 
|  | ///    let now = Instant::now(); | 
|  | /// | 
|  | ///    // we sleep for 2 seconds | 
|  | ///    sleep(Duration::new(2, 0)); | 
|  | ///    // it prints '2' | 
|  | ///    println!("{}", now.elapsed().as_secs()); | 
|  | /// } | 
|  | /// ``` | 
|  | /// | 
|  | /// [platform bugs]: Instant#monotonicity | 
|  | /// | 
|  | /// # OS-specific behaviors | 
|  | /// | 
|  | /// An `Instant` is a wrapper around system-specific types and it may behave | 
|  | /// differently depending on the underlying operating system. For example, | 
|  | /// the following snippet is fine on Linux but panics on macOS: | 
|  | /// | 
|  | /// ```no_run | 
|  | /// use std::time::{Instant, Duration}; | 
|  | /// | 
|  | /// let now = Instant::now(); | 
|  | /// let days_per_10_millennia = 365_2425; | 
|  | /// let solar_seconds_per_day = 60 * 60 * 24; | 
|  | /// let millennium_in_solar_seconds = 31_556_952_000; | 
|  | /// assert_eq!(millennium_in_solar_seconds, days_per_10_millennia * solar_seconds_per_day / 10); | 
|  | /// | 
|  | /// let duration = Duration::new(millennium_in_solar_seconds, 0); | 
|  | /// println!("{:?}", now + duration); | 
|  | /// ``` | 
|  | /// | 
|  | /// For cross-platform code, you can comfortably use durations of up to around one hundred years. | 
|  | /// | 
|  | /// # Underlying System calls | 
|  | /// | 
|  | /// The following system calls are [currently] being used by `now()` to find out | 
|  | /// the current time: | 
|  | /// | 
|  | /// |  Platform |               System call                                            | | 
|  | /// |-----------|----------------------------------------------------------------------| | 
|  | /// | SGX       | [`insecure_time` usercall]. More information on [timekeeping in SGX] | | 
|  | /// | UNIX      | [clock_gettime] with `CLOCK_MONOTONIC`                               | | 
|  | /// | Darwin    | [clock_gettime] with `CLOCK_UPTIME_RAW`                              | | 
|  | /// | VXWorks   | [clock_gettime] with `CLOCK_MONOTONIC`                               | | 
|  | /// | SOLID     | `get_tim`                                                            | | 
|  | /// | WASI      | [__wasi_clock_time_get] with `monotonic`                             | | 
|  | /// | Windows   | [QueryPerformanceCounter]                                            | | 
|  | /// | 
|  | /// [currently]: crate::io#platform-specific-behavior | 
|  | /// [QueryPerformanceCounter]: https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter | 
|  | /// [`insecure_time` usercall]: https://edp.fortanix.com/docs/api/fortanix_sgx_abi/struct.Usercalls.html#method.insecure_time | 
|  | /// [timekeeping in SGX]: https://edp.fortanix.com/docs/concepts/rust-std/#codestdtimecode | 
|  | /// [__wasi_clock_time_get]: https://github.com/WebAssembly/WASI/blob/main/legacy/preview1/docs.md#clock_time_get | 
|  | /// [clock_gettime]: https://linux.die.net/man/3/clock_gettime | 
|  | /// | 
|  | /// **Disclaimer:** These system calls might change over time. | 
|  | /// | 
|  | /// > Note: mathematical operations like [`add`] may panic if the underlying | 
|  | /// > structure cannot represent the new point in time. | 
|  | /// | 
|  | /// [`add`]: Instant::add | 
|  | /// | 
|  | /// ## Monotonicity | 
|  | /// | 
|  | /// On all platforms `Instant` will try to use an OS API that guarantees monotonic behavior | 
|  | /// if available, which is the case for all [tier 1] platforms. | 
|  | /// In practice such guarantees are – under rare circumstances – broken by hardware, virtualization | 
|  | /// or operating system bugs. To work around these bugs and platforms not offering monotonic clocks | 
|  | /// [`duration_since`], [`elapsed`] and [`sub`] saturate to zero. In older Rust versions this | 
|  | /// lead to a panic instead. [`checked_duration_since`] can be used to detect and handle situations | 
|  | /// where monotonicity is violated, or `Instant`s are subtracted in the wrong order. | 
|  | /// | 
|  | /// This workaround obscures programming errors where earlier and later instants are accidentally | 
|  | /// swapped. For this reason future Rust versions may reintroduce panics. | 
|  | /// | 
|  | /// [tier 1]: https://doc.rust-lang.org/rustc/platform-support.html | 
|  | /// [`duration_since`]: Instant::duration_since | 
|  | /// [`elapsed`]: Instant::elapsed | 
|  | /// [`sub`]: Instant::sub | 
|  | /// [`checked_duration_since`]: Instant::checked_duration_since | 
|  | /// | 
|  | #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | #[cfg_attr(not(test), rustc_diagnostic_item = "Instant")] | 
|  | pub struct Instant(time::Instant); | 
|  |  | 
|  | /// A measurement of the system clock, useful for talking to | 
|  | /// external entities like the file system or other processes. | 
|  | /// | 
|  | /// Distinct from the [`Instant`] type, this time measurement **is not | 
|  | /// monotonic**. This means that you can save a file to the file system, then | 
|  | /// save another file to the file system, **and the second file has a | 
|  | /// `SystemTime` measurement earlier than the first**. In other words, an | 
|  | /// operation that happens after another operation in real time may have an | 
|  | /// earlier `SystemTime`! | 
|  | /// | 
|  | /// Consequently, comparing two `SystemTime` instances to learn about the | 
|  | /// duration between them returns a [`Result`] instead of an infallible [`Duration`] | 
|  | /// to indicate that this sort of time drift may happen and needs to be handled. | 
|  | /// | 
|  | /// Although a `SystemTime` cannot be directly inspected, the [`UNIX_EPOCH`] | 
|  | /// constant is provided in this module as an anchor in time to learn | 
|  | /// information about a `SystemTime`. By calculating the duration from this | 
|  | /// fixed point in time, a `SystemTime` can be converted to a human-readable time, | 
|  | /// or perhaps some other string representation. | 
|  | /// | 
|  | /// The size of a `SystemTime` struct may vary depending on the target operating | 
|  | /// system. | 
|  | /// | 
|  | /// A `SystemTime` does not count leap seconds. | 
|  | /// `SystemTime::now()`'s behavior around a leap second | 
|  | /// is the same as the operating system's wall clock. | 
|  | /// The precise behavior near a leap second | 
|  | /// (e.g. whether the clock appears to run slow or fast, or stop, or jump) | 
|  | /// depends on platform and configuration, | 
|  | /// so should not be relied on. | 
|  | /// | 
|  | /// Example: | 
|  | /// | 
|  | /// ```no_run | 
|  | /// use std::time::{Duration, SystemTime}; | 
|  | /// use std::thread::sleep; | 
|  | /// | 
|  | /// fn main() { | 
|  | ///    let now = SystemTime::now(); | 
|  | /// | 
|  | ///    // we sleep for 2 seconds | 
|  | ///    sleep(Duration::new(2, 0)); | 
|  | ///    match now.elapsed() { | 
|  | ///        Ok(elapsed) => { | 
|  | ///            // it prints '2' | 
|  | ///            println!("{}", elapsed.as_secs()); | 
|  | ///        } | 
|  | ///        Err(e) => { | 
|  | ///            // the system clock went backwards! | 
|  | ///            println!("Great Scott! {e:?}"); | 
|  | ///        } | 
|  | ///    } | 
|  | /// } | 
|  | /// ``` | 
|  | /// | 
|  | /// # Platform-specific behavior | 
|  | /// | 
|  | /// The precision of `SystemTime` can depend on the underlying OS-specific time format. | 
|  | /// For example, on Windows the time is represented in 100 nanosecond intervals whereas Linux | 
|  | /// can represent nanosecond intervals. | 
|  | /// | 
|  | /// The following system calls are [currently] being used by `now()` to find out | 
|  | /// the current time: | 
|  | /// | 
|  | /// |  Platform |               System call                                            | | 
|  | /// |-----------|----------------------------------------------------------------------| | 
|  | /// | SGX       | [`insecure_time` usercall]. More information on [timekeeping in SGX] | | 
|  | /// | UNIX      | [clock_gettime (Realtime Clock)]                                     | | 
|  | /// | Darwin    | [clock_gettime (Realtime Clock)]                                     | | 
|  | /// | VXWorks   | [clock_gettime (Realtime Clock)]                                     | | 
|  | /// | SOLID     | `SOLID_RTC_ReadTime`                                                 | | 
|  | /// | WASI      | [__wasi_clock_time_get (Realtime Clock)]                             | | 
|  | /// | Windows   | [GetSystemTimePreciseAsFileTime] / [GetSystemTimeAsFileTime]         | | 
|  | /// | 
|  | /// [currently]: crate::io#platform-specific-behavior | 
|  | /// [`insecure_time` usercall]: https://edp.fortanix.com/docs/api/fortanix_sgx_abi/struct.Usercalls.html#method.insecure_time | 
|  | /// [timekeeping in SGX]: https://edp.fortanix.com/docs/concepts/rust-std/#codestdtimecode | 
|  | /// [clock_gettime (Realtime Clock)]: https://linux.die.net/man/3/clock_gettime | 
|  | /// [__wasi_clock_time_get (Realtime Clock)]: https://github.com/WebAssembly/WASI/blob/main/legacy/preview1/docs.md#clock_time_get | 
|  | /// [GetSystemTimePreciseAsFileTime]: https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemtimepreciseasfiletime | 
|  | /// [GetSystemTimeAsFileTime]: https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemtimeasfiletime | 
|  | /// | 
|  | /// **Disclaimer:** These system calls might change over time. | 
|  | /// | 
|  | /// > Note: mathematical operations like [`add`] may panic if the underlying | 
|  | /// > structure cannot represent the new point in time. | 
|  | /// | 
|  | /// [`add`]: SystemTime::add | 
|  | /// [`UNIX_EPOCH`]: SystemTime::UNIX_EPOCH | 
|  | #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | pub struct SystemTime(time::SystemTime); | 
|  |  | 
|  | /// An error returned from the `duration_since` and `elapsed` methods on | 
|  | /// `SystemTime`, used to learn how far in the opposite direction a system time | 
|  | /// lies. | 
|  | /// | 
|  | /// # Examples | 
|  | /// | 
|  | /// ```no_run | 
|  | /// use std::thread::sleep; | 
|  | /// use std::time::{Duration, SystemTime}; | 
|  | /// | 
|  | /// let sys_time = SystemTime::now(); | 
|  | /// sleep(Duration::from_secs(1)); | 
|  | /// let new_sys_time = SystemTime::now(); | 
|  | /// match sys_time.duration_since(new_sys_time) { | 
|  | ///     Ok(_) => {} | 
|  | ///     Err(e) => println!("SystemTimeError difference: {:?}", e.duration()), | 
|  | /// } | 
|  | /// ``` | 
|  | #[derive(Clone, Debug)] | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | pub struct SystemTimeError(Duration); | 
|  |  | 
|  | impl Instant { | 
|  | /// Returns an instant corresponding to "now". | 
|  | /// | 
|  | /// # Examples | 
|  | /// | 
|  | /// ``` | 
|  | /// use std::time::Instant; | 
|  | /// | 
|  | /// let now = Instant::now(); | 
|  | /// ``` | 
|  | #[must_use] | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | #[cfg_attr(not(test), rustc_diagnostic_item = "instant_now")] | 
|  | pub fn now() -> Instant { | 
|  | Instant(time::Instant::now()) | 
|  | } | 
|  |  | 
|  | /// Returns the amount of time elapsed from another instant to this one, | 
|  | /// or zero duration if that instant is later than this one. | 
|  | /// | 
|  | /// # Panics | 
|  | /// | 
|  | /// Previous Rust versions panicked when `earlier` was later than `self`. Currently this | 
|  | /// method saturates. Future versions may reintroduce the panic in some circumstances. | 
|  | /// See [Monotonicity]. | 
|  | /// | 
|  | /// [Monotonicity]: Instant#monotonicity | 
|  | /// | 
|  | /// # Examples | 
|  | /// | 
|  | /// ```no_run | 
|  | /// use std::time::{Duration, Instant}; | 
|  | /// use std::thread::sleep; | 
|  | /// | 
|  | /// let now = Instant::now(); | 
|  | /// sleep(Duration::new(1, 0)); | 
|  | /// let new_now = Instant::now(); | 
|  | /// println!("{:?}", new_now.duration_since(now)); | 
|  | /// println!("{:?}", now.duration_since(new_now)); // 0ns | 
|  | /// ``` | 
|  | #[must_use] | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | pub fn duration_since(&self, earlier: Instant) -> Duration { | 
|  | self.checked_duration_since(earlier).unwrap_or_default() | 
|  | } | 
|  |  | 
|  | /// Returns the amount of time elapsed from another instant to this one, | 
|  | /// or None if that instant is later than this one. | 
|  | /// | 
|  | /// Due to [monotonicity bugs], even under correct logical ordering of the passed `Instant`s, | 
|  | /// this method can return `None`. | 
|  | /// | 
|  | /// [monotonicity bugs]: Instant#monotonicity | 
|  | /// | 
|  | /// # Examples | 
|  | /// | 
|  | /// ```no_run | 
|  | /// use std::time::{Duration, Instant}; | 
|  | /// use std::thread::sleep; | 
|  | /// | 
|  | /// let now = Instant::now(); | 
|  | /// sleep(Duration::new(1, 0)); | 
|  | /// let new_now = Instant::now(); | 
|  | /// println!("{:?}", new_now.checked_duration_since(now)); | 
|  | /// println!("{:?}", now.checked_duration_since(new_now)); // None | 
|  | /// ``` | 
|  | #[must_use] | 
|  | #[stable(feature = "checked_duration_since", since = "1.39.0")] | 
|  | pub fn checked_duration_since(&self, earlier: Instant) -> Option<Duration> { | 
|  | self.0.checked_sub_instant(&earlier.0) | 
|  | } | 
|  |  | 
|  | /// Returns the amount of time elapsed from another instant to this one, | 
|  | /// or zero duration if that instant is later than this one. | 
|  | /// | 
|  | /// # Examples | 
|  | /// | 
|  | /// ```no_run | 
|  | /// use std::time::{Duration, Instant}; | 
|  | /// use std::thread::sleep; | 
|  | /// | 
|  | /// let now = Instant::now(); | 
|  | /// sleep(Duration::new(1, 0)); | 
|  | /// let new_now = Instant::now(); | 
|  | /// println!("{:?}", new_now.saturating_duration_since(now)); | 
|  | /// println!("{:?}", now.saturating_duration_since(new_now)); // 0ns | 
|  | /// ``` | 
|  | #[must_use] | 
|  | #[stable(feature = "checked_duration_since", since = "1.39.0")] | 
|  | pub fn saturating_duration_since(&self, earlier: Instant) -> Duration { | 
|  | self.checked_duration_since(earlier).unwrap_or_default() | 
|  | } | 
|  |  | 
|  | /// Returns the amount of time elapsed since this instant. | 
|  | /// | 
|  | /// # Panics | 
|  | /// | 
|  | /// Previous Rust versions panicked when the current time was earlier than self. Currently this | 
|  | /// method returns a Duration of zero in that case. Future versions may reintroduce the panic. | 
|  | /// See [Monotonicity]. | 
|  | /// | 
|  | /// [Monotonicity]: Instant#monotonicity | 
|  | /// | 
|  | /// # Examples | 
|  | /// | 
|  | /// ```no_run | 
|  | /// use std::thread::sleep; | 
|  | /// use std::time::{Duration, Instant}; | 
|  | /// | 
|  | /// let instant = Instant::now(); | 
|  | /// let three_secs = Duration::from_secs(3); | 
|  | /// sleep(three_secs); | 
|  | /// assert!(instant.elapsed() >= three_secs); | 
|  | /// ``` | 
|  | #[must_use] | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | pub fn elapsed(&self) -> Duration { | 
|  | Instant::now() - *self | 
|  | } | 
|  |  | 
|  | /// Returns `Some(t)` where `t` is the time `self + duration` if `t` can be represented as | 
|  | /// `Instant` (which means it's inside the bounds of the underlying data structure), `None` | 
|  | /// otherwise. | 
|  | #[stable(feature = "time_checked_add", since = "1.34.0")] | 
|  | pub fn checked_add(&self, duration: Duration) -> Option<Instant> { | 
|  | self.0.checked_add_duration(&duration).map(Instant) | 
|  | } | 
|  |  | 
|  | /// Returns `Some(t)` where `t` is the time `self - duration` if `t` can be represented as | 
|  | /// `Instant` (which means it's inside the bounds of the underlying data structure), `None` | 
|  | /// otherwise. | 
|  | #[stable(feature = "time_checked_add", since = "1.34.0")] | 
|  | pub fn checked_sub(&self, duration: Duration) -> Option<Instant> { | 
|  | self.0.checked_sub_duration(&duration).map(Instant) | 
|  | } | 
|  |  | 
|  | // Used by platform specific `sleep_until` implementations such as the one used on Linux. | 
|  | #[cfg_attr( | 
|  | not(target_os = "linux"), | 
|  | allow(unused, reason = "not every platform has a specific `sleep_until`") | 
|  | )] | 
|  | pub(crate) fn into_inner(self) -> time::Instant { | 
|  | self.0 | 
|  | } | 
|  | } | 
|  |  | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | impl Add<Duration> for Instant { | 
|  | type Output = Instant; | 
|  |  | 
|  | /// # Panics | 
|  | /// | 
|  | /// This function may panic if the resulting point in time cannot be represented by the | 
|  | /// underlying data structure. See [`Instant::checked_add`] for a version without panic. | 
|  | fn add(self, other: Duration) -> Instant { | 
|  | self.checked_add(other).expect("overflow when adding duration to instant") | 
|  | } | 
|  | } | 
|  |  | 
|  | #[stable(feature = "time_augmented_assignment", since = "1.9.0")] | 
|  | impl AddAssign<Duration> for Instant { | 
|  | fn add_assign(&mut self, other: Duration) { | 
|  | *self = *self + other; | 
|  | } | 
|  | } | 
|  |  | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | impl Sub<Duration> for Instant { | 
|  | type Output = Instant; | 
|  |  | 
|  | fn sub(self, other: Duration) -> Instant { | 
|  | self.checked_sub(other).expect("overflow when subtracting duration from instant") | 
|  | } | 
|  | } | 
|  |  | 
|  | #[stable(feature = "time_augmented_assignment", since = "1.9.0")] | 
|  | impl SubAssign<Duration> for Instant { | 
|  | fn sub_assign(&mut self, other: Duration) { | 
|  | *self = *self - other; | 
|  | } | 
|  | } | 
|  |  | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | impl Sub<Instant> for Instant { | 
|  | type Output = Duration; | 
|  |  | 
|  | /// Returns the amount of time elapsed from another instant to this one, | 
|  | /// or zero duration if that instant is later than this one. | 
|  | /// | 
|  | /// # Panics | 
|  | /// | 
|  | /// Previous Rust versions panicked when `other` was later than `self`. Currently this | 
|  | /// method saturates. Future versions may reintroduce the panic in some circumstances. | 
|  | /// See [Monotonicity]. | 
|  | /// | 
|  | /// [Monotonicity]: Instant#monotonicity | 
|  | fn sub(self, other: Instant) -> Duration { | 
|  | self.duration_since(other) | 
|  | } | 
|  | } | 
|  |  | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | impl fmt::Debug for Instant { | 
|  | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | 
|  | self.0.fmt(f) | 
|  | } | 
|  | } | 
|  |  | 
|  | impl SystemTime { | 
|  | /// An anchor in time which can be used to create new `SystemTime` instances or | 
|  | /// learn about where in time a `SystemTime` lies. | 
|  | // | 
|  | // NOTE! this documentation is duplicated, here and in std::time::UNIX_EPOCH. | 
|  | // The two copies are not quite identical, because of the difference in naming. | 
|  | /// | 
|  | /// This constant is defined to be "1970-01-01 00:00:00 UTC" on all systems with | 
|  | /// respect to the system clock. Using `duration_since` on an existing | 
|  | /// `SystemTime` instance can tell how far away from this point in time a | 
|  | /// measurement lies, and using `UNIX_EPOCH + duration` can be used to create a | 
|  | /// `SystemTime` instance to represent another fixed point in time. | 
|  | /// | 
|  | /// `duration_since(UNIX_EPOCH).unwrap().as_secs()` returns | 
|  | /// the number of non-leap seconds since the start of 1970 UTC. | 
|  | /// This is a POSIX `time_t` (as a `u64`), | 
|  | /// and is the same time representation as used in many Internet protocols. | 
|  | /// | 
|  | /// # Examples | 
|  | /// | 
|  | /// ```no_run | 
|  | /// use std::time::SystemTime; | 
|  | /// | 
|  | /// match SystemTime::now().duration_since(SystemTime::UNIX_EPOCH) { | 
|  | ///     Ok(n) => println!("1970-01-01 00:00:00 UTC was {} seconds ago!", n.as_secs()), | 
|  | ///     Err(_) => panic!("SystemTime before UNIX EPOCH!"), | 
|  | /// } | 
|  | /// ``` | 
|  | #[stable(feature = "assoc_unix_epoch", since = "1.28.0")] | 
|  | pub const UNIX_EPOCH: SystemTime = UNIX_EPOCH; | 
|  |  | 
|  | /// Returns the system time corresponding to "now". | 
|  | /// | 
|  | /// # Examples | 
|  | /// | 
|  | /// ``` | 
|  | /// use std::time::SystemTime; | 
|  | /// | 
|  | /// let sys_time = SystemTime::now(); | 
|  | /// ``` | 
|  | #[must_use] | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | pub fn now() -> SystemTime { | 
|  | SystemTime(time::SystemTime::now()) | 
|  | } | 
|  |  | 
|  | /// Returns the amount of time elapsed from an earlier point in time. | 
|  | /// | 
|  | /// This function may fail because measurements taken earlier are not | 
|  | /// guaranteed to always be before later measurements (due to anomalies such | 
|  | /// as the system clock being adjusted either forwards or backwards). | 
|  | /// [`Instant`] can be used to measure elapsed time without this risk of failure. | 
|  | /// | 
|  | /// If successful, <code>[Ok]\([Duration])</code> is returned where the duration represents | 
|  | /// the amount of time elapsed from the specified measurement to this one. | 
|  | /// | 
|  | /// Returns an [`Err`] if `earlier` is later than `self`, and the error | 
|  | /// contains how far from `self` the time is. | 
|  | /// | 
|  | /// # Examples | 
|  | /// | 
|  | /// ```no_run | 
|  | /// use std::time::SystemTime; | 
|  | /// | 
|  | /// let sys_time = SystemTime::now(); | 
|  | /// let new_sys_time = SystemTime::now(); | 
|  | /// let difference = new_sys_time.duration_since(sys_time) | 
|  | ///     .expect("Clock may have gone backwards"); | 
|  | /// println!("{difference:?}"); | 
|  | /// ``` | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | pub fn duration_since(&self, earlier: SystemTime) -> Result<Duration, SystemTimeError> { | 
|  | self.0.sub_time(&earlier.0).map_err(SystemTimeError) | 
|  | } | 
|  |  | 
|  | /// Returns the difference from this system time to the | 
|  | /// current clock time. | 
|  | /// | 
|  | /// This function may fail as the underlying system clock is susceptible to | 
|  | /// drift and updates (e.g., the system clock could go backwards), so this | 
|  | /// function might not always succeed. If successful, <code>[Ok]\([Duration])</code> is | 
|  | /// returned where the duration represents the amount of time elapsed from | 
|  | /// this time measurement to the current time. | 
|  | /// | 
|  | /// To measure elapsed time reliably, use [`Instant`] instead. | 
|  | /// | 
|  | /// Returns an [`Err`] if `self` is later than the current system time, and | 
|  | /// the error contains how far from the current system time `self` is. | 
|  | /// | 
|  | /// # Examples | 
|  | /// | 
|  | /// ```no_run | 
|  | /// use std::thread::sleep; | 
|  | /// use std::time::{Duration, SystemTime}; | 
|  | /// | 
|  | /// let sys_time = SystemTime::now(); | 
|  | /// let one_sec = Duration::from_secs(1); | 
|  | /// sleep(one_sec); | 
|  | /// assert!(sys_time.elapsed().unwrap() >= one_sec); | 
|  | /// ``` | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | pub fn elapsed(&self) -> Result<Duration, SystemTimeError> { | 
|  | SystemTime::now().duration_since(*self) | 
|  | } | 
|  |  | 
|  | /// Returns `Some(t)` where `t` is the time `self + duration` if `t` can be represented as | 
|  | /// `SystemTime` (which means it's inside the bounds of the underlying data structure), `None` | 
|  | /// otherwise. | 
|  | #[stable(feature = "time_checked_add", since = "1.34.0")] | 
|  | pub fn checked_add(&self, duration: Duration) -> Option<SystemTime> { | 
|  | self.0.checked_add_duration(&duration).map(SystemTime) | 
|  | } | 
|  |  | 
|  | /// Returns `Some(t)` where `t` is the time `self - duration` if `t` can be represented as | 
|  | /// `SystemTime` (which means it's inside the bounds of the underlying data structure), `None` | 
|  | /// otherwise. | 
|  | #[stable(feature = "time_checked_add", since = "1.34.0")] | 
|  | pub fn checked_sub(&self, duration: Duration) -> Option<SystemTime> { | 
|  | self.0.checked_sub_duration(&duration).map(SystemTime) | 
|  | } | 
|  | } | 
|  |  | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | impl Add<Duration> for SystemTime { | 
|  | type Output = SystemTime; | 
|  |  | 
|  | /// # Panics | 
|  | /// | 
|  | /// This function may panic if the resulting point in time cannot be represented by the | 
|  | /// underlying data structure. See [`SystemTime::checked_add`] for a version without panic. | 
|  | fn add(self, dur: Duration) -> SystemTime { | 
|  | self.checked_add(dur).expect("overflow when adding duration to instant") | 
|  | } | 
|  | } | 
|  |  | 
|  | #[stable(feature = "time_augmented_assignment", since = "1.9.0")] | 
|  | impl AddAssign<Duration> for SystemTime { | 
|  | fn add_assign(&mut self, other: Duration) { | 
|  | *self = *self + other; | 
|  | } | 
|  | } | 
|  |  | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | impl Sub<Duration> for SystemTime { | 
|  | type Output = SystemTime; | 
|  |  | 
|  | fn sub(self, dur: Duration) -> SystemTime { | 
|  | self.checked_sub(dur).expect("overflow when subtracting duration from instant") | 
|  | } | 
|  | } | 
|  |  | 
|  | #[stable(feature = "time_augmented_assignment", since = "1.9.0")] | 
|  | impl SubAssign<Duration> for SystemTime { | 
|  | fn sub_assign(&mut self, other: Duration) { | 
|  | *self = *self - other; | 
|  | } | 
|  | } | 
|  |  | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | impl fmt::Debug for SystemTime { | 
|  | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | 
|  | self.0.fmt(f) | 
|  | } | 
|  | } | 
|  |  | 
|  | /// An anchor in time which can be used to create new `SystemTime` instances or | 
|  | /// learn about where in time a `SystemTime` lies. | 
|  | // | 
|  | // NOTE! this documentation is duplicated, here and in SystemTime::UNIX_EPOCH. | 
|  | // The two copies are not quite identical, because of the difference in naming. | 
|  | /// | 
|  | /// This constant is defined to be "1970-01-01 00:00:00 UTC" on all systems with | 
|  | /// respect to the system clock. Using `duration_since` on an existing | 
|  | /// [`SystemTime`] instance can tell how far away from this point in time a | 
|  | /// measurement lies, and using `UNIX_EPOCH + duration` can be used to create a | 
|  | /// [`SystemTime`] instance to represent another fixed point in time. | 
|  | /// | 
|  | /// `duration_since(UNIX_EPOCH).unwrap().as_secs()` returns | 
|  | /// the number of non-leap seconds since the start of 1970 UTC. | 
|  | /// This is a POSIX `time_t` (as a `u64`), | 
|  | /// and is the same time representation as used in many Internet protocols. | 
|  | /// | 
|  | /// # Examples | 
|  | /// | 
|  | /// ```no_run | 
|  | /// use std::time::{SystemTime, UNIX_EPOCH}; | 
|  | /// | 
|  | /// match SystemTime::now().duration_since(UNIX_EPOCH) { | 
|  | ///     Ok(n) => println!("1970-01-01 00:00:00 UTC was {} seconds ago!", n.as_secs()), | 
|  | ///     Err(_) => panic!("SystemTime before UNIX EPOCH!"), | 
|  | /// } | 
|  | /// ``` | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | pub const UNIX_EPOCH: SystemTime = SystemTime(time::UNIX_EPOCH); | 
|  |  | 
|  | impl SystemTimeError { | 
|  | /// Returns the positive duration which represents how far forward the | 
|  | /// second system time was from the first. | 
|  | /// | 
|  | /// A `SystemTimeError` is returned from the [`SystemTime::duration_since`] | 
|  | /// and [`SystemTime::elapsed`] methods whenever the second system time | 
|  | /// represents a point later in time than the `self` of the method call. | 
|  | /// | 
|  | /// # Examples | 
|  | /// | 
|  | /// ```no_run | 
|  | /// use std::thread::sleep; | 
|  | /// use std::time::{Duration, SystemTime}; | 
|  | /// | 
|  | /// let sys_time = SystemTime::now(); | 
|  | /// sleep(Duration::from_secs(1)); | 
|  | /// let new_sys_time = SystemTime::now(); | 
|  | /// match sys_time.duration_since(new_sys_time) { | 
|  | ///     Ok(_) => {} | 
|  | ///     Err(e) => println!("SystemTimeError difference: {:?}", e.duration()), | 
|  | /// } | 
|  | /// ``` | 
|  | #[must_use] | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | pub fn duration(&self) -> Duration { | 
|  | self.0 | 
|  | } | 
|  | } | 
|  |  | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | impl Error for SystemTimeError {} | 
|  |  | 
|  | #[stable(feature = "time2", since = "1.8.0")] | 
|  | impl fmt::Display for SystemTimeError { | 
|  | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | 
|  | write!(f, "second time provided was later than self") | 
|  | } | 
|  | } | 
|  |  | 
|  | impl FromInner<time::SystemTime> for SystemTime { | 
|  | fn from_inner(time: time::SystemTime) -> SystemTime { | 
|  | SystemTime(time) | 
|  | } | 
|  | } | 
|  |  | 
|  | impl IntoInner<time::SystemTime> for SystemTime { | 
|  | fn into_inner(self) -> time::SystemTime { | 
|  | self.0 | 
|  | } | 
|  | } |