$NetBSD: patch-ad,v 1.1 2009/04/16 09:54:45 he Exp $ Fix this so that it uses week numbering according to ISO 8601. --- weekno.perl.orig 1995-10-17 14:44:49.000000000 +0100 +++ weekno.perl @@ -51,7 +51,21 @@ sub weekno { sub firstdayfirstweek { -# Return first day of week 1 of any year +# Return the day of the year (0 is Jan 1st) +# for the first day of week 1 of any year. +# +# Quoting strftime(3): +# %V is replaced by the week number of the year (Monday as the first day +# of the week) as a decimal number [01,53]. According to ISO 8601 the +# week containing January 1 is week 1 if it has four or more days in +# the new year, otherwise it is week 53 of the previous year, and the +# next week is week 1. The year is given by the `%G' conversion +# specification. +# +# So this will return a negative value in some cases, i.e. when +# Jan 1st falls on either of Tuesday, Wednesday or Thursday, and +# will be positive (1) or zero for Sunday or Monday respectively. +# local($y) = @_; local($ret); # Get time of January 1, 0.0.0.0 @@ -59,13 +73,14 @@ sub firstdayfirstweek { local($firsttime) = &main'timelocal(0, 0, 0, 1, 0, $y, 0, 0, 0); local(@firstday) = localtime($firsttime); local($wday) = $firstday[6]; - # Rule works for some years.....89 to 92 tested, they all hit branch 2... - if ($wday > 3) { - $ret = 8 - $wday; + # Weekday 4 is Thursday (localtime returns zero-based with Sunday = 0) + if ($wday <= 4) { + $ret = 1 - $wday; # first day of week 1 may be in late December + # The exception is when Jan 1 = Sunday (wday 0) } else { - $ret = 1 - $wday; + $ret = 8 - $wday; # first day of week 1 is in January } - $ret; + return $ret; } sub firstinweek {