Number of weeks in year?
Anthony Jones posted on Tuesday, September 16, 2008 8:22 AM
float w = (DateTime.IsLeapYear(year) ? 366 : 365) / 7
Or are do you measure the count of weeks by the appearance of a specific day
of the week considered to be the start of a week in that year?
--
Anthony Jones - MVP ASP/ASP.NET |
|
Is there something special about the Danish calendar?
Clint posted on Tuesday, September 16, 2008 9:12 AM
Is there something special about the Danish calendar? i.e. is the answer not
always 52? (plus a couple of days) |
|
Number of weeks in year?
MortenWennevi posted on Tuesday, September 16, 2008 9:55 AM
Sometimes there are 53 weeks in a year.
int year = 2004;
DateTime dt = new DateTime(year, 12, 31);
int week = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(
dt,
CalendarWeekRule.FirstFourDayWeek,
DayOfWeek.Monday);
// week == 53
--
Happy Coding!
Morten Wennevik [C# MVP] |
|
Hi Clint.That doesn't work.Theres an error in the framework.
Tommy Jakobsen posted on Tuesday, September 16, 2008 10:02 AM
Hi Clint.
That does not work.
Theres an error in the framework. Using date DateTime(2008, 12, 31) returns 53,
but theres only 52 weeks in year 2008.
Any idea? |
|
Hi TommyI had the same problem when I was working with a calendarprogram and
TAB posted on Tuesday, September 16, 2008 10:27 AM
Hi Tommy
I had the same problem when I was working with a calendarprogram and found
this somewhere on the Internet.
Apperently there is an old bug .Net that hasn't be solved yet.
This is working for me, I have checked several years back and forth.
// get week number for current date
public int WeekNumber(DateTime fromDate)
{
// Get jan 1st of the year
DateTime startOfYear = fromDate.AddDays(-fromDate.Day +
1).AddMonths(-fromDate.Month + 1);
// Get dec 31st of the year
DateTime endOfYear = startOfYear.AddYears(1).AddDays(-1);
// ISO 8601 weeks start with Monday
// The first week of a year includes the first Thursday, i.e. at
least 4 days
// DayOfWeek returns 0 for sunday up to 6 for Saturday
int[] iso8601Correction = { 6, 7, 8, 9, 10, 4, 5 };
int nds = fromDate.Subtract(startOfYear).Days +
iso8601Correction[(int)startOfYear.DayOfWeek];
int wk = nds / 7;
switch (wk)
{
case 0:
// Return weeknumber of dec 31st of the previous year
return WeekNumber(startOfYear.AddDays(-1));
case 53:
// If dec 31st falls before thursday it is week 01 of
next year
if (endOfYear.DayOfWeek < DayOfWeek.Thursday)
return 1;
else
return wk;
default: return wk;
} |
|
Thank you.
Tommy Jakobsen posted on Tuesday, September 16, 2008 10:38 AM
Thank you. Thats working yes, but it doesn't return the number of weeks in the
year. It returns the correct number of the week at day 2008-12-31 (week 1, not
53).
How can I modify this to return the number of weeks in the year (52 or 53)? |
|
I think this is the source of what I wrote and the same method somewhat
TAB posted on Tuesday, September 16, 2008 10:44 AM
I think this is the source of what I wrote and the same method somewhat
modified.
produce results incompatible with ISO 8601"
and the GetWeekOfYear() method do NOT produce
week numbers according to ISO 8601."
private int WeekNumber_Entire4DayWeekRule(DateTime date)
{
const int JAN = 1;
const int DEC = 12;
const int LASTDAYOFDEC = 31;
const int FIRSTDAYOFJAN = 1;
const int THURSDAY = 4;
bool ThursdayFlag = false;
int DayOfYear = date.DayOfYear;
int StartWeekDayOfYear =
(int)(new DateTime(date.Year, JAN, FIRSTDAYOFJAN)).DayOfWeek;
int EndWeekDayOfYear =
(int)(new DateTime(date.Year, DEC, LASTDAYOFDEC)).DayOfWeek;
StartWeekDayOfYear = StartWeekDayOfYear;
EndWeekDayOfYear = EndWeekDayOfYear;
if( StartWeekDayOfYear == 0)
StartWeekDayOfYear = 7;
if( EndWeekDayOfYear == 0)
EndWeekDayOfYear = 7;
int DaysInFirstWeek = 8 - (StartWeekDayOfYear );
int DaysInLastWeek = 8 - (EndWeekDayOfYear );
if (StartWeekDayOfYear == THURSDAY || EndWeekDayOfYear == THURSDAY)
ThursdayFlag = true;
int FullWeeks = (int) Math.Ceiling((DayOfYear -
(DaysInFirstWeek))/7.0);
int WeekNumber = FullWeeks;
if (DaysInFirstWeek >= THURSDAY)
WeekNumber = WeekNumber +1;
if (WeekNumber > 52 && !ThursdayFlag)
WeekNumber = 1;
if (WeekNumber == 0)
WeekNumber = WeekNumber_Entire4DayWeekRule(
new DateTime(date.Year-1, DEC, LASTDAYOFDEC));
return WeekNumber;
} |
|
Number of weeks in year?
TAB posted on Tuesday, September 16, 2008 10:45 AM
"Tommy Jakobsen" <tommy@holmjakobsen.dk> skrev i meddelandet |
|
One way would be to do a loop and subtract 1 day until you find a weeknumber
TAB posted on Tuesday, September 16, 2008 10:49 AM
One way would be to do a loop and subtract 1 day until you find a weeknumber
bigger than 1, that would be 53 or 52. |
|
That method returns the same as the previous method, doesn't it?
Tommy Jakobsen posted on Tuesday, September 16, 2008 10:54 AM
That method returns the same as the previous method, does not it?
it is still not what I am looking for. |
|
Start with the last day of the year and subtract on day at a time until you
TAB posted on Tuesday, September 16, 2008 11:18 AM
Start with the last day of the year and subtract on day at a time until you
find the previous week, whatever it may be. |
|
I got it modified to take year as parameter and return the total number of
Tommy Jakobsen posted on Tuesday, September 16, 2008 1:28 PM
I got it modified to take year as parameter and return the total number of weeks
(52/53) in that year.
Thanks for your replies guys. |
|
Number of weeks in year?
TAB posted on Tuesday, September 16, 2008 3:12 PM
It's been a long time since I worked with this so I have to quote
Wikipedia on ISO 8601 regarding week numbers.
The ISO year number deviates from the number of the Gregorian year on, if
applicable, a Friday, Saturday, and Sunday, or a Saturday and Sunday, or
just a Sunday, at the start of the Gregorian year (which are at the end of
the previous ISO year) and a Monday, Tuesday and Wednesday, or a Monday and
Tuesday, or just a Monday, at the end of the Gregorian year (which are in
week 01 of the next ISO year). In the period 4 January-28 December and on
all Thursdays the ISO year number is always equal to the Gregorian year
number.
Mutually equivalent definitions for week 01 are:
the week with the year's first Thursday in it
the week starting with the Monday which is nearest in time to 1 January
the week with the year's first working day in it (if Saturdays, Sundays, and
1 January are not working days)
the week with January 4 in it
the first week with the majority (four or more) of its days in the starting
year
the week starting with the Monday in the period 29 December - 4 January
the week with the Thursday in the period 1 - 7 January
If 1 January is on a Monday, Tuesday, Wednesday or Thursday, it is in week
01. If 1 January is on a Friday, Saturday or Sunday, it is in week 52 or 53
of the previous year.
Note that while most definitions are symmetric with respect to time
reversal, one definition in terms of working days happens to be equivalent.
The last week of the ISO year is the week before week 01; in accordance with
the symmetry of the definition, equivalent definitions are:
the week with the year's last Thursday in it
the week ending with the Sunday which is nearest in time to 31 December
the week with December 28 in it
the last week with the majority (four or more) of its days in the ending
year
the week starting with the Monday in the period 22 - 28 December
the week with the Thursday in the period 25 - 31 December
the week ending with the Sunday in the period 28 December - 3 January
If 31 December is on a Monday, Tuesday, or Wednesday, it is in week 01 of
the next year, otherwise in week 52 or 53.
The following years have 53 weeks:
years starting with Thursday
leap years starting with Wednesday |
|
Number of weeks in year?
G.S. posted on Thursday, September 18, 2008 6:48 AM
te:
ayOfWeek;
yOfWeek;
=3D THURSDAY)
));
ound
Date.Day +
AddDays(-1);
Thursday, i.e.
aturday
, 5 };
+
t of the previous year
ddDays(-1));
rsday it is week 01 of
Week.Thursday)
dar.GetWeekOfYear(
I'd echo firts responder's question - what do you consider the first
week?
The example in this article should clarify things a bit:
http://msdn.microsoft.com/en-us/library/system.globalization.calendarweekru=
le(VS.95).aspx |
|
|
|
|
Didn't Find The Answer You Were Looking For? |
| EggHeadCafe has experts online right now that may know the answer to your question. We pay them a bonus for answering as many questions as they can. So, why not help them and yourself by becoming a member (free) and ask them your question right now? |
| Create Account & Ask Question In Live Forum |
|
|