Updated post that works for Sweden:
private static int WeekNumber_Entire4DayWeekRule( DateTime date )
{
// Updated 2004.09.27. Cleaned the code and fixed a bug. Compared the algorithm with
// code published here . Tested code successfully against the other algorithm
// for all dates in all years between 1900 and 2100.
// Thanks to Marcus Dahlberg for pointing out the deficient logic.
// Calculates the ISO 8601 Week Number
// In this scenario the first day of the week is monday,
// and the week rule states that:
// [...] the first calendar week of a year is the one
// that includes the first Thursday of that year and
// [...] the last calendar week of a calendar year is
// the week immediately preceding the first
// calendar week of the next year.
// The first week of the year may thus start in the
// preceding year
const int JAN = 1;
const int DEC = 12;
const int LASTDAYOFDEC = 31;
const int FIRSTDAYOFJAN = 1;
const int THURSDAY = 4;
bool ThursdayFlag = false;
// Get the day number since the beginning of the year
int DayOfYear = date.DayOfYear;
// Get the numeric weekday of the first day of the
// year (using sunday as FirstDay)
int StartWeekDayOfYear = ( int ) ( new DateTime ( date.Year, JAN, FIRSTDAYOFJAN ) ).DayOfWeek;
int EndWeekDayOfYear = ( int ) ( new DateTime( date.Year, DEC, LASTDAYOFDEC ) ).DayOfWeek;
// Compensate for the fact that we are using monday
// as the first day of the week
if( StartWeekDayOfYear == 0 )
StartWeekDayOfYear = 7;
if( EndWeekDayOfYear == 0 )
EndWeekDayOfYear = 7;
// Calculate the number of days in the first and last week
int DaysInFirstWeek = 8 - ( StartWeekDayOfYear );
int DaysInLastWeek = 8 - ( EndWeekDayOfYear );
// If the year either starts or ends on a thursday it will have a 53rd week
if( StartWeekDayOfYear == THURSDAY || EndWeekDayOfYear == THURSDAY )
ThursdayFlag = true;
// We begin by calculating the number of FULL weeks between the start of the year and
// our date. The number is rounded up, so the smallest possible value is 0.
int FullWeeks = ( int ) Math.Ceiling( ( DayOfYear - ( DaysInFirstWeek ) ) / 7.0 );
int WeekNumber = FullWeeks;
// If the first week of the year has at least four days, then the actual week number for our date
// can be incremented by one.
if( DaysInFirstWeek >= THURSDAY )
WeekNumber = WeekNumber +1;
// If week number is larger than week 52 (and the year doesn't either start or end on a thursday)
// then the correct week number is 1.
if( WeekNumber > 52 && !ThursdayFlag )
WeekNumber = 1;
// If week number is still 0, it means that we are trying to evaluate the week number for a
// week that belongs in the previous year (since that week has 3 days or less in our date's year).
// We therefore make a recursive call using the last day of the previous year.
if( WeekNumber == 0 )
WeekNumber = WeekNumber_Entire4DayWeekRule( new DateTime( date.Year-1, DEC, LASTDAYOFDEC ) );
return WeekNumber;
}
The life of a computer/sci-fy/teccie-nerd :-) Interested in lots of stuff like: Net, C#, Software Architecture, IoT, building stuff (like sensors based on RPI Pico W), Cars, Books, meeting people, learning new stuff, Cyber Security
Friday, May 12, 2006
Subscribe to:
Post Comments (Atom)
Lazzes Smart Home - 2023
Here is an overview of the components in the Smart Home as of now. More stuff than I tought :-)
-
If you, like me - use VLC mediaplayer to view all your media, you may have run into the same problem as I. That is, when we watch multiple m...
-
1) Define constants const int WM_KEYDOWN = 0x100; const int WM_KEYUP = 0x101; 2) Add interface, IMessageFilter public partial class Form1 : ...
-
The DivX register app is hardcoded to use the System32 folder as path for Rundll32, which of course doesn't exist on a 64bit system. So ...
No comments:
Post a Comment