Skip to content

Commit 7f7945e

Browse files
committed
Implement utility functions for converting TimeDelta to fractional seconds.
Add `as_seconds_f64` and `as_seconds_f32` methods to `TimeDelta` for converting durations to a fractional number of seconds, with single or double precision.
1 parent c3e7bc0 commit 7f7945e

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

src/time_delta.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,16 @@ impl TimeDelta {
304304
if self.secs < 0 && self.nanos > 0 { self.secs + 1 } else { self.secs }
305305
}
306306

307+
/// Returns the fractional number of seconds in the `TimeDelta`.
308+
pub fn as_seconds_f64(self) -> f64 {
309+
self.secs as f64 + self.nanos as f64 / NANOS_PER_SEC as f64
310+
}
311+
312+
/// Returns the fractional number of seconds in the `TimeDelta`.
313+
pub fn as_seconds_f32(self) -> f32 {
314+
self.secs as f32 + self.nanos as f32 / NANOS_PER_SEC as f32
315+
}
316+
307317
/// Returns the total number of whole milliseconds in the `TimeDelta`.
308318
pub const fn num_milliseconds(&self) -> i64 {
309319
// A proper TimeDelta will not overflow, because MIN and MAX are defined such
@@ -788,6 +798,32 @@ mod tests {
788798
let _ = TimeDelta::seconds(-i64::MAX / 1_000 - 1);
789799
}
790800

801+
#[test]
802+
fn test_duration_as_seconds_f64() {
803+
assert_eq!(TimeDelta::seconds(1).as_seconds_f64(), 1.0);
804+
assert_eq!(TimeDelta::seconds(-1).as_seconds_f64(), -1.0);
805+
assert_eq!(TimeDelta::seconds(100).as_seconds_f64(), 100.0);
806+
assert_eq!(TimeDelta::seconds(-100).as_seconds_f64(), -100.0);
807+
808+
assert_eq!(TimeDelta::milliseconds(500).as_seconds_f64(), 0.5);
809+
assert_eq!(TimeDelta::milliseconds(-500).as_seconds_f64(), -0.5);
810+
assert_eq!(TimeDelta::milliseconds(1_500).as_seconds_f64(), 1.5);
811+
assert_eq!(TimeDelta::milliseconds(-1_500).as_seconds_f64(), -1.5);
812+
}
813+
814+
#[test]
815+
fn test_duration_as_seconds_f32() {
816+
assert_eq!(TimeDelta::seconds(1).as_seconds_f32(), 1.0);
817+
assert_eq!(TimeDelta::seconds(-1).as_seconds_f32(), -1.0);
818+
assert_eq!(TimeDelta::seconds(100).as_seconds_f32(), 100.0);
819+
assert_eq!(TimeDelta::seconds(-100).as_seconds_f32(), -100.0);
820+
821+
assert_eq!(TimeDelta::milliseconds(500).as_seconds_f32(), 0.5);
822+
assert_eq!(TimeDelta::milliseconds(-500).as_seconds_f32(), -0.5);
823+
assert_eq!(TimeDelta::milliseconds(1_500).as_seconds_f32(), 1.5);
824+
assert_eq!(TimeDelta::milliseconds(-1_500).as_seconds_f32(), -1.5);
825+
}
826+
791827
#[test]
792828
fn test_duration_subsec_nanos() {
793829
assert_eq!(TimeDelta::zero().subsec_nanos(), 0);

0 commit comments

Comments
 (0)