Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Howto get the first day of the week by week number

by nite_man (Deacon)
on May 23, 2006 at 21:05 UTC ( [id://551238]=CUFP: print w/replies, xml ) Need Help??

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 (Patriarch) 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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: CUFP [id://551238]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others rifling through the Monastery: (1)
As of 2024-04-25 05:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found