@@ -102,7 +102,7 @@ const fn span_for_digits(digits: u16) -> u32 {
102
102
/// Both rounding and truncating are done via [`TimeDelta::num_nanoseconds`] and
103
103
/// [`DateTime::timestamp_nanos_opt`]. This means that they will fail if either the
104
104
/// `TimeDelta` or the `DateTime` are too big to represented as nanoseconds. They
105
- /// will also fail if the `TimeDelta` is bigger than the timestamp.
105
+ /// will also fail if the `TimeDelta` is bigger than the timestamp, negative or zero .
106
106
pub trait DurationRound : Sized {
107
107
/// Error that can occur in rounding or truncating
108
108
#[ cfg( feature = "std" ) ]
@@ -188,14 +188,11 @@ where
188
188
T : Timelike + Add < TimeDelta , Output = T > + Sub < TimeDelta , Output = T > ,
189
189
{
190
190
if let Some ( span) = duration. num_nanoseconds ( ) {
191
- if span < 0 {
191
+ if span <= 0 {
192
192
return Err ( RoundingError :: DurationExceedsLimit ) ;
193
193
}
194
194
let stamp =
195
195
naive. and_utc ( ) . timestamp_nanos_opt ( ) . ok_or ( RoundingError :: TimestampExceedsLimit ) ?;
196
- if span == 0 {
197
- return Ok ( original) ;
198
- }
199
196
let delta_down = stamp % span;
200
197
if delta_down == 0 {
201
198
Ok ( original)
@@ -225,14 +222,11 @@ where
225
222
T : Timelike + Add < TimeDelta , Output = T > + Sub < TimeDelta , Output = T > ,
226
223
{
227
224
if let Some ( span) = duration. num_nanoseconds ( ) {
228
- if span < 0 {
225
+ if span <= 0 {
229
226
return Err ( RoundingError :: DurationExceedsLimit ) ;
230
227
}
231
228
let stamp =
232
229
naive. and_utc ( ) . timestamp_nanos_opt ( ) . ok_or ( RoundingError :: TimestampExceedsLimit ) ?;
233
- if span == 0 {
234
- return Ok ( original) ;
235
- }
236
230
let delta_down = stamp % span;
237
231
match delta_down. cmp ( & 0 ) {
238
232
Ordering :: Equal => Ok ( original) ,
@@ -456,9 +450,10 @@ mod tests {
456
450
. unwrap ( ) ;
457
451
458
452
assert_eq ! (
459
- dt. duration_round( TimeDelta :: zero ( ) ) . unwrap( ) . to_string ( ) ,
460
- "2016-12-31 23:59:59.175500 UTC"
453
+ dt. duration_round( TimeDelta :: new ( - 1 , 0 ) . unwrap( ) ) ,
454
+ Err ( RoundingError :: DurationExceedsLimit ) ,
461
455
) ;
456
+ assert_eq ! ( dt. duration_round( TimeDelta :: zero( ) ) , Err ( RoundingError :: DurationExceedsLimit ) , ) ;
462
457
463
458
assert_eq ! (
464
459
dt. duration_round( TimeDelta :: try_milliseconds( 10 ) . unwrap( ) ) . unwrap( ) . to_string( ) ,
@@ -547,9 +542,10 @@ mod tests {
547
542
. naive_utc ( ) ;
548
543
549
544
assert_eq ! (
550
- dt. duration_round( TimeDelta :: zero ( ) ) . unwrap( ) . to_string ( ) ,
551
- "2016-12-31 23:59:59.175500"
545
+ dt. duration_round( TimeDelta :: new ( - 1 , 0 ) . unwrap( ) ) ,
546
+ Err ( RoundingError :: DurationExceedsLimit ) ,
552
547
) ;
548
+ assert_eq ! ( dt. duration_round( TimeDelta :: zero( ) ) , Err ( RoundingError :: DurationExceedsLimit ) , ) ;
553
549
554
550
assert_eq ! (
555
551
dt. duration_round( TimeDelta :: try_milliseconds( 10 ) . unwrap( ) ) . unwrap( ) . to_string( ) ,
@@ -624,9 +620,10 @@ mod tests {
624
620
. unwrap ( ) ;
625
621
626
622
assert_eq ! (
627
- dt. duration_trunc( TimeDelta :: zero ( ) ) . unwrap( ) . to_string ( ) ,
628
- "2016-12-31 23:59:59.175500 UTC"
623
+ dt. duration_trunc( TimeDelta :: new ( - 1 , 0 ) . unwrap( ) ) ,
624
+ Err ( RoundingError :: DurationExceedsLimit ) ,
629
625
) ;
626
+ assert_eq ! ( dt. duration_trunc( TimeDelta :: zero( ) ) , Err ( RoundingError :: DurationExceedsLimit ) , ) ;
630
627
631
628
assert_eq ! (
632
629
dt. duration_trunc( TimeDelta :: try_milliseconds( 10 ) . unwrap( ) ) . unwrap( ) . to_string( ) ,
@@ -713,6 +710,12 @@ mod tests {
713
710
. unwrap ( )
714
711
. naive_utc ( ) ;
715
712
713
+ assert_eq ! (
714
+ dt. duration_trunc( TimeDelta :: new( -1 , 0 ) . unwrap( ) ) ,
715
+ Err ( RoundingError :: DurationExceedsLimit ) ,
716
+ ) ;
717
+ assert_eq ! ( dt. duration_trunc( TimeDelta :: zero( ) ) , Err ( RoundingError :: DurationExceedsLimit ) , ) ;
718
+
716
719
assert_eq ! (
717
720
dt. duration_trunc( TimeDelta :: try_milliseconds( 10 ) . unwrap( ) ) . unwrap( ) . to_string( ) ,
718
721
"2016-12-31 23:59:59.170"
0 commit comments