$weekNum = POSIX::strftime("%V", gmtime time); #### $weekNum = UnixDate(ParseDate("today"), "%W"); #### # Returns the week number of NOW sub currentWeekNumber { # Get current year, day of year (0..364/5) day of week (0..6) my ($year, $dayOfWeek, $dayOfYear) = (gmtime time)[5,6,7]; # Adjust DayOfWeek from American 0==Sunday, to ISO 0==Monday # and year from "since 1900" to the real year return weekNumber(($dayOfWeek + 6) % 7, $dayOfYear, $year + 1900); } # Returns the week number of the specified time # Year is the real year # Day of week is 0..6 where 0==Monday # Day of year is 0..364 (or 365) where 0==Jan1 sub weekNumber { # Get parameters my ($dayOfWeek, $dayOfYear, $year) = @_; die if ($dayOfWeek < 0); die if ($dayOfWeek > 6); die if ($dayOfYear < 0); die if ($dayOfYear >= 366); die if ($year < 0); # Locate the nearest Thursday # (Done by locating the Monday at or before and going forwards 3 days) my $dayOfNearestThurs = $dayOfYear - $dayOfWeek + 3; # Is nearest thursday in last year or next year? if ($dayOfNearestThurs < 0) { # Nearest Thurs is last year # We are at the start of the year # Adjust by the number of days in LAST year $dayOfNearestThurs += daysInYear($year-1); } my $daysInThisYear = daysInYear($year); if ($dayOfNearestThurs > $daysInThisYear) { # Nearest Thurs is next year # We are at the end of the year # Adjust by the number of days in THIS year $dayOfNearestThurs -= $daysInThisYear; } # Which week does the Thurs fall into? my $weekNum = int ($dayOfNearestThurs / 7); # Week numbering starts with 1 $weekNum += 1; # Pad with 0s to force 2 digit representation return substr "0"x2 . $weekNum, -2; } # Returns the number of... sub daysInYear { return 366 unless $_[0] % 400; return 365 unless $_[0] % 100; return 366 unless $_[0] % 4; return 365; }