@@ -922,15 +922,17 @@ impl FromStr for Duration {
922
922
923
923
let ( hours, minutes, seconds, millis, micros, nanos) = match parse_record. time {
924
924
Some ( TimeDurationRecord :: Hours { hours, fraction } ) => {
925
- let ns = fraction. and_then ( |x| x. to_nanoseconds ( ) ) . unwrap_or ( 0 ) as u64 ;
926
- let minutes = ns. div_euclid ( 60 * 1_000_000_000 ) ;
927
- let rem = ns. rem_euclid ( 60 * 1_000_000_000 ) ;
925
+ let unadjusted_fraction =
926
+ fraction. and_then ( |x| x. to_nanoseconds ( ) ) . unwrap_or ( 0 ) as u64 ;
927
+ let fractional_hours_ns = unadjusted_fraction * 3600 ;
928
+ let minutes = fractional_hours_ns. div_euclid ( 60 * 1_000_000_000 ) ;
929
+ let fractional_minutes_ns = fractional_hours_ns. rem_euclid ( 60 * 1_000_000_000 ) ;
928
930
929
- let seconds = rem . div_euclid ( 1_000_000_000 ) ;
930
- let rem = rem . rem_euclid ( 1_000_000_000 ) ;
931
+ let seconds = fractional_minutes_ns . div_euclid ( 1_000_000_000 ) ;
932
+ let fractional_seconds = fractional_minutes_ns . rem_euclid ( 1_000_000_000 ) ;
931
933
932
- let milliseconds = rem . div_euclid ( 1_000_000 ) ;
933
- let rem = rem . rem_euclid ( 1_000_000 ) ;
934
+ let milliseconds = fractional_seconds . div_euclid ( 1_000_000 ) ;
935
+ let rem = fractional_seconds . rem_euclid ( 1_000_000 ) ;
934
936
935
937
let microseconds = rem. div_euclid ( 1_000 ) ;
936
938
let nanoseconds = rem. rem_euclid ( 1_000 ) ;
@@ -950,12 +952,14 @@ impl FromStr for Duration {
950
952
minutes,
951
953
fraction,
952
954
} ) => {
953
- let ns = fraction. and_then ( |x| x. to_nanoseconds ( ) ) . unwrap_or ( 0 ) ;
954
- let seconds = ns. div_euclid ( 1_000_000_000 ) ;
955
- let rem = ns. rem_euclid ( 1_000_000_000 ) ;
956
-
957
- let milliseconds = rem. div_euclid ( 1_000_000 ) ;
958
- let rem = rem. rem_euclid ( 1_000_000 ) ;
955
+ let unadjusted_fraction =
956
+ fraction. and_then ( |x| x. to_nanoseconds ( ) ) . unwrap_or ( 0 ) as u64 ;
957
+ let fractional_minutes_ns = unadjusted_fraction * 60 ;
958
+ let seconds = fractional_minutes_ns. div_euclid ( 1_000_000_000 ) ;
959
+ let fractional_seconds = fractional_minutes_ns. rem_euclid ( 1_000_000_000 ) ;
960
+
961
+ let milliseconds = fractional_seconds. div_euclid ( 1_000_000 ) ;
962
+ let rem = fractional_seconds. rem_euclid ( 1_000_000 ) ;
959
963
960
964
let microseconds = rem. div_euclid ( 1_000 ) ;
961
965
let nanoseconds = rem. rem_euclid ( 1_000 ) ;
0 commit comments