From 6f4a6b585d211529b6d64b4449a9294f22277df8 Mon Sep 17 00:00:00 2001 From: Paul Dicker Date: Thu, 4 May 2023 15:34:04 +0200 Subject: [PATCH 1/2] Fix *_DAYS_FROM_YEAR_0 calculation --- src/naive/date.rs | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/naive/date.rs b/src/naive/date.rs index 907b1285d1..20866b7b87 100644 --- a/src/naive/date.rs +++ b/src/naive/date.rs @@ -3235,22 +3235,16 @@ mod tests { } // MAX_YEAR-12-31 minus 0000-01-01 - // = ((MAX_YEAR+1)-01-01 minus 0001-01-01) + (0001-01-01 minus 0000-01-01) - 1 day - // = ((MAX_YEAR+1)-01-01 minus 0001-01-01) + 365 days - // = MAX_YEAR * 365 + (# of leap years from 0001 to MAX_YEAR) + 365 days + // = (MAX_YEAR-12-31 minus 0000-12-31) + (0000-12-31 - 0000-01-01) + // = MAX_YEAR * 365 + (# of leap years from 0001 to MAX_YEAR) + 365 + // = (MAX_YEAR + 1) * 365 + (# of leap years from 0001 to MAX_YEAR) const MAX_DAYS_FROM_YEAR_0: i32 = - MAX_YEAR * 365 + MAX_YEAR / 4 - MAX_YEAR / 100 + MAX_YEAR / 400 + 365; + (MAX_YEAR + 1) * 365 + MAX_YEAR / 4 - MAX_YEAR / 100 + MAX_YEAR / 400; // MIN_YEAR-01-01 minus 0000-01-01 - // = (MIN_YEAR+400n+1)-01-01 minus (400n+1)-01-01 - // = ((MIN_YEAR+400n+1)-01-01 minus 0001-01-01) - ((400n+1)-01-01 minus 0001-01-01) - // = ((MIN_YEAR+400n+1)-01-01 minus 0001-01-01) - 146097n days - // - // n is set to 1000 for convenience. - const MIN_DAYS_FROM_YEAR_0: i32 = (MIN_YEAR + 400_000) * 365 + (MIN_YEAR + 400_000) / 4 - - (MIN_YEAR + 400_000) / 100 - + (MIN_YEAR + 400_000) / 400 - - 146_097_000; + // = MIN_YEAR * 365 + (# of leap years from MIN_YEAR to 0000) + const MIN_DAYS_FROM_YEAR_0: i32 = + MIN_YEAR * 365 + MIN_YEAR / 4 - MIN_YEAR / 100 + MIN_YEAR / 400; // only used for testing, but duplicated in naive::datetime const MAX_BITS: usize = 44; From 913c502276c3344a4ec456fe138108e4739d74db Mon Sep 17 00:00:00 2001 From: Paul Dicker Date: Fri, 19 May 2023 17:21:09 +0200 Subject: [PATCH 2/2] Also report correct ordinal in `test_date_bounds` --- src/naive/date.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/naive/date.rs b/src/naive/date.rs index 20866b7b87..700958e171 100644 --- a/src/naive/date.rs +++ b/src/naive/date.rs @@ -2405,13 +2405,14 @@ mod tests { let calculated_max = NaiveDate::from_ymd_opt(MAX_YEAR, 12, 31).unwrap(); assert!( NaiveDate::MIN == calculated_min, - "`NaiveDate::MIN` should have a year flag {:?}", + "`NaiveDate::MIN` should have year flag {:?}", calculated_min.of().flags() ); assert!( NaiveDate::MAX == calculated_max, - "`NaiveDate::MAX` should have a year flag {:?}", - calculated_max.of().flags() + "`NaiveDate::MAX` should have year flag {:?} and ordinal {}", + calculated_max.of().flags(), + calculated_max.of().ordinal() ); // let's also check that the entire range do not exceed 2^44 seconds