Skip to content

Commit 167dfc5

Browse files
committed
cal: start-of-month display fixes
Fixes #356
1 parent b84921e commit 167dfc5

File tree

1 file changed

+22
-22
lines changed

1 file changed

+22
-22
lines changed

datetime/cal.rs

+22-22
Original file line numberDiff line numberDiff line change
@@ -52,37 +52,37 @@ fn print_month(month: u32, year: u32) {
5252
_ => unreachable!(),
5353
};
5454

55-
println!("{} {}", month_name, year);
55+
println!(" {} {}", month_name, year);
5656
println!("{}", gettext("Su Mo Tu We Th Fr Sa"));
5757

58-
let mut day = 1;
59-
let mut weekday = 1;
60-
let mut days_in_month = 31;
61-
if month == 4 || month == 6 || month == 9 || month == 11 {
62-
days_in_month = 30;
63-
} else if month == 2 {
64-
if year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) {
65-
days_in_month = 29;
66-
} else {
67-
days_in_month = 28;
58+
let first_day = chrono::NaiveDate::from_ymd_opt(year as i32, month, 1).unwrap();
59+
let start_weekday = first_day.weekday().num_days_from_sunday(); // 0 (Sun) to 6 (Sat)
60+
61+
let days_in_month = match month {
62+
4 | 6 | 9 | 11 => 30,
63+
2 => {
64+
if year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) {
65+
29
66+
} else {
67+
28
68+
}
6869
}
70+
_ => 31,
71+
};
72+
73+
// Print initial padding
74+
for _ in 0..start_weekday {
75+
print!(" ");
6976
}
7077

71-
while day <= days_in_month {
72-
print!("{:2}", day);
73-
day += 1;
74-
weekday += 1;
75-
if weekday > 7 {
78+
for day in 1..=days_in_month {
79+
print!("{:2} ", day);
80+
if (start_weekday + day) % 7 == 0 {
7681
println!();
77-
weekday = 1;
78-
} else {
79-
print!(" ");
8082
}
8183
}
8284

83-
if weekday != 1 {
84-
println!();
85-
}
85+
println!();
8686
}
8787

8888
fn print_year(year: u32) {

0 commit comments

Comments
 (0)