Day in a Week/Month/Year or Week Number
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.
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 discussion below, 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 Section 3.3 and then use
the solution above, 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);
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
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 ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.