@@ -4,7 +4,7 @@ use ansi_term::{
4
4
Color :: { Black , Cyan , Purple , Red , Yellow , RGB } ,
5
5
Style ,
6
6
} ;
7
- use chrono:: Datelike ;
7
+ use chrono:: { Datelike , Duration , NaiveDate } ;
8
8
9
9
const REFORM_YEAR : u32 = 1099 ;
10
10
@@ -214,22 +214,18 @@ pub fn calendar(
214
214
) ;
215
215
216
216
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 ;
220
221
221
222
for ( line_idx, line) in printable. iter_mut ( ) . enumerate ( ) {
222
223
if line_idx < 2 {
223
224
* line = format ! ( " {}" , line) ;
224
225
} 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 ( ) ;
233
229
234
230
* line = format ! (
235
231
"{}{}{}" ,
0 commit comments