From 167dfc5d8b809054b4da1a48277d88a5476e9393 Mon Sep 17 00:00:00 2001 From: Jeff Garzik Date: Wed, 2 Apr 2025 15:58:26 -0400 Subject: [PATCH] cal: start-of-month display fixes Fixes #356 --- datetime/cal.rs | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/datetime/cal.rs b/datetime/cal.rs index cd38adc9e..fdefbe9a5 100644 --- a/datetime/cal.rs +++ b/datetime/cal.rs @@ -52,37 +52,37 @@ fn print_month(month: u32, year: u32) { _ => unreachable!(), }; - println!("{} {}", month_name, year); + println!(" {} {}", month_name, year); println!("{}", gettext("Su Mo Tu We Th Fr Sa")); - let mut day = 1; - let mut weekday = 1; - let mut days_in_month = 31; - if month == 4 || month == 6 || month == 9 || month == 11 { - days_in_month = 30; - } else if month == 2 { - if year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) { - days_in_month = 29; - } else { - days_in_month = 28; + let first_day = chrono::NaiveDate::from_ymd_opt(year as i32, month, 1).unwrap(); + let start_weekday = first_day.weekday().num_days_from_sunday(); // 0 (Sun) to 6 (Sat) + + let days_in_month = match month { + 4 | 6 | 9 | 11 => 30, + 2 => { + if year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) { + 29 + } else { + 28 + } } + _ => 31, + }; + + // Print initial padding + for _ in 0..start_weekday { + print!(" "); } - while day <= days_in_month { - print!("{:2}", day); - day += 1; - weekday += 1; - if weekday > 7 { + for day in 1..=days_in_month { + print!("{:2} ", day); + if (start_weekday + day) % 7 == 0 { println!(); - weekday = 1; - } else { - print!(" "); } } - if weekday != 1 { - println!(); - } + println!(); } fn print_year(year: u32) {