http://www.perlmonks.org?node_id=551242


in reply to Howto get the first day of the week by week number

Not all days are of the same length in all time zones, so $wc * 24 * 3600 is wrong. The simplest workaround is to use a time zone that doesn't have daylight savings time to do date calculations. For example, the following doesn't suffer from this bug:

sub get_date_by_week { my $week = shift || 1; my $year = shift || (localtime)[5]; my $pattern = shift || '%d/%m'; my $t = timegm(0, 0, 0, 1, 0, $year); my $w = (gmtime($t))[6]; $w = ($w - 2) % 7 + 1; my $wc = $week * 7 - $w; return strftime($pattern, gmtime($t + $wc * 24 * 3600)); }

This works, because the answer to "the date x days before date y" is the same in all time zones for a given x and y. x and y are obtained using localtime (as in my $year = shift || (localtime)[5];), but the arithmetic is done using timegm+gmtime.