Perl Monk, Perl Meditation PerlMonks

### Howto get the first day of the week by week number

by nite_man (Deacon)
 on May 23, 2006 at 21:05 UTC Need Help??
 Description: Today I faced with small problem. I prepared a chart where data was split by weeks. It was very easy except one thing: display the first day of the week instead of week number. Here is a one way to do it (the main idea belongs to my co-worker Igor) P. S. Other way is to use Date::Calc - (\$y, \$m, \$d) = Monday_of_Week(\$week, \$year); Updated: added support of time zone.
```use Time::Local qw(timelocal timegm);
use POSIX qw(strftime);

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, localtime(\$t + \$wc * 24 * 3600));
}
```
Replies are listed 'Best First'.
Re: Howto get the first day of the week by week number
by ikegami (Pope) on May 23, 2006 at 21:41 UTC

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.

Create A New User
Node Status?
node history
Node Type: snippet [id://551238]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (6)
As of 2021-06-18 12:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
What does the "s" stand for in "perls"? (Whence perls)

Results (89 votes). Check out past polls.

Notices?