Re: Number of weeks in year?

Tech-Archive recommends: Fix windows errors by optimizing your registry





"G.S." <gstoynev@xxxxxxxxx> skrev i meddelandet news:8169487c-e2cd-4a1e-b86c-8c5172aaba0d@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
On Sep 16, 10:54 am, Tommy Jakobsen <to...@xxxxxxxxxxxxxxx> wrote:
That method returns the same as the previous method, doesn't it?

It's still not what I'm looking for.



On Tue, 16 Sep 2008 16:44:03 +0200, "TAB" <anders.bergl...@xxxxxxxxx> wrote:
>I think this is the source of what I wrote and the same method somewhat
>modified.

>"Simen Sandelien says that will
>produce results incompatible with ISO 8601"

>"He has this to say about that :"

>"My conclusion is that the builtin .NET FourDayWeekRule
>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;
>}

>"TAB" <anders.bergl...@xxxxxxxxx> skrev i meddelandet
>news:e9bxOhAGJHA.2112@xxxxxxxxxxxxxxxxxxxxxxx
>> 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;
>> }

>> "Tommy Jakobsen" <to...@xxxxxxxxxxxxxxx> skrev i meddelandet
>>news:n0fvc4t3t64tc5509d9v7ulvcda9uq8vqi@xxxxxxxxxx
>>> Hi Clint.

>>> That doesn't 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?

>>> On Tue, 16 Sep 2008 06:55:01 -0700, Morten Wennevik [C# MVP]
>>> <MortenWenne...@xxxxxxxxxxx> wrote:

>>>>"Clint" wrote:

>>>>> Is there something special about the Danish calendar? i.e. is the
>>>>> answer not
>>>>> always 52? (plus a couple of days)

>>>>> "Tommy Jakobsen" <to...@xxxxxxxxxxxxxxx> wrote in message
>>>>>news:1m8vc4pr3thq7pl7n75u7p20fn7bd4ms6o@xxxxxxxxxx
>>>>> > Hi.

>>>>> > Is there a method in .NET that takes "year" as an argument and
>>>>> > returns the
>>>>> > total
>>>>> > number of weeks in that year? For culture da-DK (Danish).

>>>>> > Thanks in advance.

>>>>> > Tommy.

>>>>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- Hide quoted text -

- Show quoted text -

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.calendarweekrule(VS.95).aspx

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


.



Relevant Pages

  • Re: All programs are undefined, Re: Why this works???
    ... terms of the capabilities of a particular machine about whose details ISO ... void printat(const char *s, int x, int y, int bg, int fg) ... If this technique were not well-defined under the above circumstances, ... these programs were able to rely on the well-definedness of this technique ...
    (comp.lang.c)
  • Re: Garbage Collection - Stop Making Trash
    ... > as soon as the ECMA standard is ratified, it will be submitted to ISO. ... int main ... pointer, it cannot be moved by the GC and will not be garbage collected. ...
    (comp.lang.cpp)
  • Re: code portability
    ... All the ISO guys had to do was - nothing at all! ... wrongly assumes long int is precisely 32 bits is already broken, ... long as you can spare the space), and don't worry about changing data ... most companies don't switch compilers too often. ...
    (comp.lang.c)
  • Re: Number of weeks in year?
    ... private int WeekNumber_Entire4DayWeekRule ... StartWeekDayOfYear = StartWeekDayOfYear; ... EndWeekDayOfYear = EndWeekDayOfYear; ... int WeekNumber = FullWeeks; ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: Number of weeks in year?
    ... private int WeekNumber_Entire4DayWeekRule ... StartWeekDayOfYear = StartWeekDayOfYear; ... EndWeekDayOfYear = EndWeekDayOfYear; ... int WeekNumber = FullWeeks; ...
    (microsoft.public.dotnet.languages.csharp)