_________ Oct 2017 _________ Week 1: 01 Week 2: 02 03 04 05 06 07 08 Week 3: 09 10 11 12 13 14 15 Week 4: 16 17 18 19 20 21 22 Week 5: 23 24 25 26 27 28 29 Week 6: 30 31 #### use warnings; use strict; use DateTime; my $year = 2017; for my $month (1..12) { my $dt = DateTime->new(year=>$year,month=>$month); print "_"x9,$dt->strftime(" %b %Y "),"_"x9,"\n"; my $prevweek=-1; while ($dt->month==$month) { my $week = $dt->week_of_month(); print $prevweek<0?'':"\n", "Week ",$week+1,":" if $week != $prevweek; printf " %02d", $dt->day; $prevweek=$week; $dt->add(days=>1); } print "\n"; } #### ________________________ 2017 ________________________ Week Mon Tue Wed Thu Fri Sat Sun 52 Dec 26 27 28 29 30 31 Jan 01 (Dec Week 6, Jan Week 1) 1 02 03 04 05 06 07 08 (Jan Week 2) 2 09 10 11 12 13 14 15 (Jan Week 3) 3 16 17 18 19 20 21 22 (Jan Week 4) 4 23 24 25 26 27 28 29 (Jan Week 5) 5 30 31 Feb 01 02 03 04 05 (Feb Week 2, Jan Week 6) ... 39 25 26 27 28 29 30 Oct 01 (Oct Week 1, Sep Week 5) 40 02 03 04 05 06 07 08 (Oct Week 2) 41 09 10 11 12 13 14 15 (Oct Week 3) 42 16 17 18 19 20 21 22 (Oct Week 4) 43 23 24 25 26 27 28 29 (Oct Week 5) 44 30 31 Nov 01 02 03 04 05 (Nov Week 2, Oct Week 6) ... #### use warnings; use strict; use DateTime; my $year = 2017; my $dt = DateTime->new(year=>$year)->truncate(to=>'week'); print "_"x24," $year ","_"x24,"\n"; my $dt1 = $dt->clone; print "Week "; for (1..7) { print " ",$dt1->day_abbr; $dt1->add(days=>1); } print "\n"; my $prevmonth=0; for (1..54) { # weeks my $weekno = $dt->week_number; printf "%4d ", $weekno; my %names; for (1..7) { # days in the week die unless $dt->week_number==$weekno; printf " %3s %02d", $prevmonth==$dt->month?'':$dt->month_abbr, $dt->day; $names{$dt->month_abbr." Week ".($dt->week_of_month+1)}++; $prevmonth=$dt->month; $dt->add(days=>1); } print " (".join(', ',sort keys %names),")\n"; }