@@ -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,7 +222,7 @@ 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 =
@@ -453,9 +450,10 @@ mod tests {
453
450
. unwrap ( ) ;
454
451
455
452
assert_eq ! (
456
- dt. duration_round( TimeDelta :: zero ( ) ) . unwrap( ) . to_string ( ) ,
457
- "2016-12-31 23:59:59.175500 UTC"
453
+ dt. duration_round( TimeDelta :: new ( - 1 , 0 ) . unwrap( ) ) ,
454
+ Err ( RoundingError :: DurationExceedsLimit )
458
455
) ;
456
+ assert_eq ! ( dt. duration_round( TimeDelta :: zero( ) ) , Err ( RoundingError :: DurationExceedsLimit ) ) ;
459
457
460
458
assert_eq ! (
461
459
dt. duration_round( TimeDelta :: try_milliseconds( 10 ) . unwrap( ) ) . unwrap( ) . to_string( ) ,
@@ -544,9 +542,10 @@ mod tests {
544
542
. naive_utc ( ) ;
545
543
546
544
assert_eq ! (
547
- dt. duration_round( TimeDelta :: zero ( ) ) . unwrap( ) . to_string ( ) ,
548
- "2016-12-31 23:59:59.175500"
545
+ dt. duration_round( TimeDelta :: new ( - 1 , 0 ) . unwrap( ) ) ,
546
+ Err ( RoundingError :: DurationExceedsLimit )
549
547
) ;
548
+ assert_eq ! ( dt. duration_round( TimeDelta :: zero( ) ) , Err ( RoundingError :: DurationExceedsLimit ) ) ;
550
549
551
550
assert_eq ! (
552
551
dt. duration_round( TimeDelta :: try_milliseconds( 10 ) . unwrap( ) ) . unwrap( ) . to_string( ) ,
@@ -620,6 +619,12 @@ mod tests {
620
619
)
621
620
. unwrap ( ) ;
622
621
622
+ assert_eq ! (
623
+ dt. duration_trunc( TimeDelta :: new( -1 , 0 ) . unwrap( ) ) ,
624
+ Err ( RoundingError :: DurationExceedsLimit )
625
+ ) ;
626
+ assert_eq ! ( dt. duration_trunc( TimeDelta :: zero( ) ) , Err ( RoundingError :: DurationExceedsLimit ) ) ;
627
+
623
628
assert_eq ! (
624
629
dt. duration_trunc( TimeDelta :: try_milliseconds( 10 ) . unwrap( ) ) . unwrap( ) . to_string( ) ,
625
630
"2016-12-31 23:59:59.170 UTC"
@@ -705,6 +710,12 @@ mod tests {
705
710
. unwrap ( )
706
711
. naive_utc ( ) ;
707
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
+
708
719
assert_eq ! (
709
720
dt. duration_trunc( TimeDelta :: try_milliseconds( 10 ) . unwrap( ) ) . unwrap( ) . to_string( ) ,
710
721
"2016-12-31 23:59:59.170"
0 commit comments