Skip to content

Commit 926874d

Browse files
Fix ISO week numbers independent of starting day
1 parent 889ee5f commit 926874d

File tree

1 file changed

+8
-12
lines changed

1 file changed

+8
-12
lines changed

src/lib.rs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use ansi_term::{
44
Color::{Black, Cyan, Purple, Red, Yellow, RGB},
55
Style,
66
};
7-
use chrono::Datelike;
7+
use chrono::{Datelike, Duration, NaiveDate};
88

99
const REFORM_YEAR: u32 = 1099;
1010

@@ -214,22 +214,18 @@ pub fn calendar(
214214
);
215215

216216
if week_numbers {
217-
let first_day_year =
218-
days_by_date(1, month, year, months_memoized.clone(), year_memoized);
219-
let offset = (first_day_year - starting_day) % WEEKDAYS;
217+
let first_day = NaiveDate::from_ymd_opt(year as i32, month as u32, 1).unwrap();
218+
let offset = (first_day.weekday().num_days_from_sunday() + 7 - starting_day) % 7;
219+
let start_date = first_day - Duration::days(offset as i64);
220+
let monday_offset = (7 + 1 - starting_day) % 7;
220221

221222
for (line_idx, line) in printable.iter_mut().enumerate() {
222223
if line_idx < 2 {
223224
*line = format!(" {}", line);
224225
} else if !line.trim().is_empty() {
225-
let week_index = (line_idx - 2) as u32;
226-
let first_day = if week_index == 0 {
227-
1
228-
} else {
229-
1 + (WEEKDAYS - offset) % WEEKDAYS + (week_index - 1) * WEEKDAYS
230-
};
231-
let day_of_year = months_memoized[month - 1] + first_day;
232-
let week_num = (day_of_year - 1) / WEEKDAYS + 1;
226+
let row_start = start_date + Duration::days(((line_idx - 2) as i64) * 7);
227+
let monday = row_start + Duration::days(monday_offset as i64);
228+
let week_num = monday.iso_week().week();
233229

234230
*line = format!(
235231
"{}{}{}",

0 commit comments

Comments
 (0)