# Recipe 3.6 Day in a Week/Month/Year or Week Number

#### 3.6.1 Problem

You have a date, either in Epoch seconds or as distinct year, month, etc. values. You want to find out what week of the year, day of the week, day of the month, or day of the year that the date falls on.

#### 3.6.2 Solution

If you have Epoch seconds, the day of the year, day of the month, and day of the week are returned by localtime. The week of the year is easily calculated from the day of the year (but see the following discussion, as standards differ).

```(\$MONTHDAY, \$WEEKDAY, \$YEARDAY) = (localtime \$DATE)[3,6,7];
\$WEEKNUM = int(\$YEARDAY / 7) + 1;```

If you have distinct DMYHMS values, you can either convert them to Epoch seconds values as in Recipe 3.2 and then use the previous solution, or else use the Day_of_Week, Week_Number, and Day_of_Year functions from the CPAN module Date::Calc:

```use Date::Calc qw(Day_of_Week Week_Number Day_of_Year);
# you have \$year, \$month, and \$day
# \$day is day of month, by definition.
\$wday = Day_of_Week(\$year, \$month, \$day);
\$wnum = Week_Number(\$year, \$month, \$day);
\$dnum = Day_of_Year(\$year, \$month, \$day);```

#### 3.6.3 Discussion

The Day_of_Week, Week_Number, and Day_of_Year functions all expect years that haven't had 1900 subtracted from them and months where January is 1, not 0. The return value from Day_of_Week can be 1 through 7 (corresponding to Monday through Sunday) or 0 in case of an error (an invalid date, for example).

```use Date::Calc qw(Day_of_Week Week_Number Day_of_Week_to_Text);

\$year  = 1981;
\$month = 6;         # (June)
\$day   = 16;

\$wday = Day_of_Week(\$year, \$month, \$day);
print "\$month/\$day/\$year was a ", Day_of_Week_to_Text(\$wday), "\n";
## see comment above

\$wnum = Week_Number(\$year, \$month, \$day);
print "in the \$wnum week.\n";
6/16/1981 was a Tuesday
in week number 25.```

The governing standard bodies of particular countries may have rules about when the first week of the year starts. For example, in Norway the first week must have at least 4 days in it (and weeks start on Mondays). If January 1 falls on a week with 3 or fewer days, it is counted as week 52 (or 53) of the previous year. In America, the first Monday of the year is usually the start of the first workweek. Given such rules, you may have to write your own algorithm, or at least look at the %G, %L, %W, and %U formats to the UnixDate function in Date::Manip.

The localtime function in perlfunc(1) and Chapter 29 of Programming Perl; the documentation for the CPAN module Date::Calc

 Chapter 1. Strings
 Chapter 2. Numbers
 Chapter 4. Arrays
 Chapter 5. Hashes
 Chapter 6. Pattern Matching
 Chapter 7. File Access
 Chapter 8. File Contents
 Chapter 9. Directories
 Chapter 10. Subroutines
 Chapter 11. References and Records
 Chapter 12. Packages, Libraries, and Modules
 Chapter 13. Classes, Objects, and Ties
 Chapter 14. Database Access
 Chapter 15. Interactivity
 Chapter 16. Process Management and Communication
 Chapter 17. Sockets
 Chapter 18. Internet Services
 Chapter 19. CGI Programming
 Chapter 20. Web Automation
 Chapter 21. mod_perl
 Chapter 22. XML