Skip to content

Commit

Permalink
Simplify from_isoywd a bit
Browse files Browse the repository at this point in the history
  • Loading branch information
pitdicker committed Feb 27, 2024
1 parent a6c0c64 commit e292d9b
Showing 1 changed file with 21 additions and 25 deletions.
46 changes: 21 additions & 25 deletions src/naive/date/mod.rs
Expand Up @@ -314,33 +314,29 @@ impl NaiveDate {
pub const fn from_isoywd_opt(year: i32, week: u32, weekday: Weekday) -> Option<NaiveDate> {
let flags = YearFlags::from_year(year);
let nweeks = flags.nisoweeks();
if 1 <= week && week <= nweeks {
// ordinal = week ordinal - delta
let weekord = week * 7 + weekday as u32;
let delta = flags.isoweek_delta();
if weekord <= delta {
// ordinal < 1, previous year
let prevflags = YearFlags::from_year(year - 1);
NaiveDate::from_ordinal_and_flags(
year - 1,
weekord + prevflags.ndays() - delta,
prevflags,
)
if week == 0 || week > nweeks {
return None;
}
// ordinal = week ordinal - delta
let weekord = week * 7 + weekday as u32;
let delta = flags.isoweek_delta();
let (year, ordinal, flags) = if weekord <= delta {
// ordinal < 1, previous year
let prevflags = YearFlags::from_year(year - 1);
(year - 1, weekord + prevflags.ndays() - delta, prevflags)
} else {
let ordinal = weekord - delta;
let ndays = flags.ndays();
if ordinal <= ndays {
// this year
(year, ordinal, flags)
} else {
let ordinal = weekord - delta;
let ndays = flags.ndays();
if ordinal <= ndays {
// this year
NaiveDate::from_ordinal_and_flags(year, ordinal, flags)
} else {
// ordinal > ndays, next year
let nextflags = YearFlags::from_year(year + 1);
NaiveDate::from_ordinal_and_flags(year + 1, ordinal - ndays, nextflags)
}
// ordinal > ndays, next year
let nextflags = YearFlags::from_year(year + 1);
(year + 1, ordinal - ndays, nextflags)
}
} else {
None
}
};
NaiveDate::from_ordinal_and_flags(year, ordinal, flags)
}

/// Makes a new `NaiveDate` from a day's number in the proleptic Gregorian calendar, with
Expand Down

0 comments on commit e292d9b

Please sign in to comment.