First off, I'm not trying to be sarcastic nor am I going to get into any debate about this with you. I will just try and explain the reasoning behind the function results. I'm sorry that you seem to have a difference of opinion on this matter. This year is a prime example of a week containing only a single day and that would be the 53 week of the year December 31,2006
Consider the following
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim D1 As Date = #1/1/2006#
Dim D2 As Date = #1/8/2006#
Dim D3 As Date = #12/31/2006#
Console.WriteLine(GetWeekNumber(D1))
Console.WriteLine(GetWeekNumber(D2))
Console.WriteLine(GetWeekNumber(D3))
End Sub
Private Function GetWeekNumber(ByVal D As Date) As Integer
Return DatePart(DateInterval.WeekOfYear, D)
End Function
The output of which is
1
2
53
The first day of this year is Sunday January 1st the first week of this year also starts on the same day and the following Sunday starts week number 2 and so on until the last day of the year which only contains a single day (as in my #2) which is week 53!
If you change the years your results will not change because the first day of the year is always in the first week (logically of course) and 7 days from that is in week two and so on!
Using your example is also a great example of week one only containing a single day saturday january 1 2005. Sunday January 2nd, 2005 in fact starts the second week of the year. The first week only had a single day included in it. (as in my #2)
I believe that our difference is a result of you thinking that the week of the year has to contain 7 complete days...Try and think of it this way, a week is a row of days in the year...
Lets look at Jan 05
Sun
Mon
Tue
Wed
Thu
Fri
Sat
1
WEEK1
2
3
4
5
6
7
8
WEEK2
9
10
11
12
13
14
15
WEEK3
16
17
18
19
20
21
22
WEEK4
23
24
25
26
27
28
29
WEEK5
30
31
WEEK6
Febuary 1st in in the sixth week of the year. Obviously some one else out there thinks that the weeks are calculated this way because the DatePart function returns what I expect to be the correct week number no matter your example.
2. You count a week as any 7 day period starting with Sunday that contains at least a single day
Yeah right !! Name a 7 day period that doesn't contain a single day.
If you look at the end of 2004 into 2005 your method produces the following result:
December 31st 2004 Week 53
January 1st 2005 Week 01
January 2nd 2005 Week 02
by any reckoning surely this is nonsense.
I think most people would expect week number to refer to the week number they see when they look in their diaries. In every diary I have looked at this is calculated to the ISO 8601 standard
In this, week 1 is the first week of the year which contains a Thursday and it starts on the previous Monday even if that Monday was in the previous year.
Have a look at the link I posted above for more information.
That may be a very concise "solution" but unfortunately it doesn't give the right answer a lot of the time - like through the whole of 2005, 2010 and 2011.
It also shows some "weeks" only lasting for a day or so. Week 1 in 2005 only lasted for one day for instance and week 2 started on January 2nd. The final week (53) in 2004 only lasted for 6 days. It also starts the week on Sunday and not Monday which is the usual start day.
It appears to start week 1 on January 1st and changes to week 2 on the following Sunday. This is not what most people would expect when they talk about week number.
I also think that the way of defining the first week of the year differs somewhat in different countries !
which is precisely why ISO 8601 was introduced.
DMan - I wasn't particulary trying to be sarcastic, although reading it again maybe it came over that way.
The point is that there is a lot of confusion over this and so a standard was introduced to try and resolve it and that is what many people use these days.
Your code has been marked as an answer and that may lead people searching these forums to believe that it will produce a result to the ISO standard. It doesn't.
I think my number of days in a leap year is wrong (i can never remember) but it think it works about close enough anyway
Private Sub WhatWeek
Dim DOY As Integer = Now.DayOfYear ' Get the current day of year
Dim NOD As Integer 'number of days in a year
Dim NW As Integer = 52 'number of weeks in a year (might have to mess with this with leap years)
Dim TY As Integer = Now.Year 'current year. for leap year checking
Dim CW As Integer ' current week
If Date.IsLeapYear(TY) = True Then
NOD = 365
Else
NOD = 366
End If
CW = DOY / NOD * NW
MsgBox(Format(CW,
"#"))
End Sub
Its probably the wrong way to do it but i think it works. If you run that code exactly it should give you an answer of twelve. My check of outlook tells me its week 12 :)
Weeknumber
Lantaio
Yeah, actually I had forgotten that feature was broken.
I did convert the C# code from the link posted by Dave299 if anyone is interested:
Try
Dim dt As New DateTime
dt = DateTime.Today
Console.WriteLine("Gregorian Date : {0}", dt.ToString("d", System.Globalization.DateTimeFormatInfo.InvariantInfo))
Console.WriteLine("ISO Date : {0}", DateEx.DisplayISODate(dt))
Catch ex As Exception
Console.WriteLine("Error " + ControlChars.Lf + ControlChars.Lf + " {0}", ex.ToString())
End Try
Public
Class DateEx' Static Method to check Leap Year
Public Shared Function IsLeapYear(ByVal yyyy As Integer) As Boolean
If yyyy Mod 4 = 0 AndAlso yyyy Mod 100 <> 0 OrElse yyyy Mod 400 = 0 Then
Return True
Else
Return False
End If
End Function 'IsLeapYear
' Static Method to return ISO WeekNumber (1-53) for a given year
Public Shared Function ISOWeekNumber(ByVal dt As DateTime) As Integer
' Set Year
Dim yyyy As Integer = dt.Year
' Set Month
Dim mm As Integer = dt.Month
' Set Day
Dim dd As Integer = dt.Day
' Declare other required variables
Dim DayOfYearNumber As Integer
Dim Jan1WeekDay As Integer
Dim WeekNumber As Integer = 0
Dim WeekDay As Integer
Dim i, j, k, l, m, n As Integer
Dim Mnth(12) As Integer
Mnth(0) = 0
Mnth(1) = 31
Mnth(2) = 59
Mnth(3) = 90
Mnth(4) = 120
Mnth(5) = 151
Mnth(6) = 181
Mnth(7) = 212
Mnth(8) = 243
Mnth(9) = 273
Mnth(10) = 304
Mnth(11) = 334
Dim YearNumber As Integer
' Set DayofYear Number for yyyy mm dd
DayOfYearNumber = dd + Mnth((mm - 1))
' Increase of Dayof Year Number by 1, if year is leapyear and month is february
If IsLeapYear(yyyy) = True AndAlso mm = 2 Then
DayOfYearNumber += 1
End If
' Find the Jan1WeekDay for year
i = (yyyy - 1) Mod 100
j = yyyy - 1 - i
k = i + i / 4
Jan1WeekDay = 1 + ((j / 100 Mod 4) * 5 + k) Mod 7
' Calcuate the WeekDay for the given date
l = DayOfYearNumber + (Jan1WeekDay - 1)
WeekDay = 1 + (l - 1) Mod 7
' Find if the date falls in YearNumber set WeekNumber to 52 or 53
If DayOfYearNumber <= 8 - Jan1WeekDay AndAlso Jan1WeekDay > 4 Then
YearNumber = yyyy - 1
If Jan1WeekDay = 5 OrElse (Jan1WeekDay = 6 AndAlso Jan1WeekDay > 4) Then
WeekNumber = 53
Else
WeekNumber = 52
End If
Else
YearNumber = yyyy
End If
' Set WeekNumber to 1 to 53 if date falls in YearNumber
If YearNumber = yyyy Then
If IsLeapYear(yyyy) = True Then
m = 366
Else
m = 365
End If
If m - DayOfYearNumber < 4 - WeekDay Then
YearNumber = yyyy + 1
WeekNumber = 1
End If
End If
If YearNumber = yyyy Then
n = DayOfYearNumber + (7 - WeekDay) + (Jan1WeekDay - 1)
WeekNumber = n / 7
If Jan1WeekDay > 4 Then
WeekNumber -= 1
End If
End If
Return WeekNumber
End Function 'ISOWeekNumber
' Static Method to Calculate WeekDay (Monday=1...Sunday=7)
Public Shared Function WeekDay(ByVal dt As DateTime) As Integer
' Set Year
Dim yyyy As Integer = dt.Year
' Set Month
Dim mm As Integer = dt.Month
' Set Day
Dim dd As Integer = dt.Day
' Declare other required variables
Dim DayOfYearNumber As Integer
Dim Jan1WeekDay As Integer
Dim WkDay As Integer
Dim i, j, k, l As Integer
Dim Mnth(12) As Integer
Mnth(0) = 0
Mnth(1) = 31
Mnth(2) = 59
Mnth(3) = 90
Mnth(4) = 120
Mnth(5) = 151
Mnth(6) = 181
Mnth(7) = 212
Mnth(8) = 243
Mnth(9) = 273
Mnth(10) = 304
Mnth(11) = 334
' Set DayofYear Number for yyyy mm dd
DayOfYearNumber = dd + Mnth((mm - 1))
' Increase of Dayof Year Number by 1, if year is leapyear and month is february
If IsLeapYear(yyyy) = True AndAlso mm = 2 Then
DayOfYearNumber += 1
End If
' Find the Jan1WeekDay for year
i = (yyyy - 1) Mod 100
j = yyyy - 1 - i
k = i + i / 4
Jan1WeekDay = 1 + ((j / 100 Mod 4) * 5 + k) Mod 7
' Calcuate the WeekDay for the given date
l = DayOfYearNumber + (Jan1WeekDay - 1)
WkDay = 1 + (l - 1) Mod 7
Return WkDay
End Function 'WeekDay
' Static Method to Display date in ISO Format (Year - WeekNumber - WeekDay)
Public Shared Function DisplayISODate(ByVal dt As DateTime) As String
Dim str As String
Dim year, WkDay, weeknumber As Integer
year = dt.Year
weeknumber = ISOWeekNumber(dt)
WkDay = WeekDay(dt)
str = year.ToString("d0") + "-" + weeknumber.ToString("d0") + "-" + WkDay.ToString("d0")
Return str
End Function 'DisplayISODate
End
ClassAAjusLT
Dave,
First off, I'm not trying to be sarcastic nor am I going to get into any debate about this with you. I will just try and explain the reasoning behind the function results. I'm sorry that you seem to have a difference of opinion on this matter. This year is a prime example of a week containing only a single day and that would be the 53 week of the year December 31,2006
Consider the following
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim D1 As Date = #1/1/2006# Dim D2 As Date = #1/8/2006# Dim D3 As Date = #12/31/2006# Console.WriteLine(GetWeekNumber(D1)) Console.WriteLine(GetWeekNumber(D2)) Console.WriteLine(GetWeekNumber(D3)) End Sub Private Function GetWeekNumber(ByVal D As Date) As Integer Return DatePart(DateInterval.WeekOfYear, D) End FunctionThe output of which is
1
2
53
The first day of this year is Sunday January 1st the first week of this year also starts on the same day and the following Sunday starts week number 2 and so on until the last day of the year which only contains a single day (as in my #2) which is week 53!
If you change the years your results will not change because the first day of the year is always in the first week (logically of course) and 7 days from that is in week two and so on!
Using your example is also a great example of week one only containing a single day saturday january 1 2005. Sunday January 2nd, 2005 in fact starts the second week of the year. The first week only had a single day included in it. (as in my #2)
I believe that our difference is a result of you thinking that the week of the year has to contain 7 complete days...Try and think of it this way, a week is a row of days in the year...
Lets look at Jan 05
Febuary 1st in in the sixth week of the year. Obviously some one else out there thinks that the weeks are calculated this way because the DatePart function returns what I expect to be the correct week number no matter your example.
Actually it makes perfect sense!
krick
Well that doesn't work for me.
There's an interesting article about this here
http://www.thecodeproject.com/csharp/GregToISO.asp msg=396665
The code is in C# but shouldn't be too difficult to convert
Dirk Van der Straeten
Depends upon what you actually need. For all I know he could have been asking for the week number of the current month.
Generic questions tend to result in generic answers. ;-)
snepsir
dibzee
It only gives me the value "ww" I think it only works in VB6 or so !
Sorry for my short question !
I ment, How to get the weeknumber of the year with the weeks starting on mondays.
Anyway, Thanks for your quick response !
Thomas !
thunderchicken
This code sample is from VB.Net 2003, so it may or may not work.
Dim CI As New System.Globalization.CultureInfo("en-US") Dim Cal As System.Globalization.Calendar = CI.CalendarMsgBox(Cal.GetWeekOfYear(Now, Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday))
Peter Peter
The visualbasic function does return the expected result if:
1. You use the correct start of the week which is Sunday (not Monday the work day)
2. You count a week as any 7 day period starting with Sunday that contains at least a single day
Facri
Format(Now(), "ww")
Charley_Chen_bj
Yeah right !! Name a 7 day period that doesn't contain a single day.
If you look at the end of 2004 into 2005 your method produces the following result:
December 31st 2004 Week 53
January 1st 2005 Week 01
January 2nd 2005 Week 02
by any reckoning surely this is nonsense.
I think most people would expect week number to refer to the week number they see when they look in their diaries. In every diary I have looked at this is calculated to the ISO 8601 standard
In this, week 1 is the first week of the year which contains a Thursday and it starts on the previous Monday even if that Monday was in the previous year.
Have a look at the link I posted above for more information.
Dave
Dima671
That may be a very concise "solution" but unfortunately it doesn't give the right answer a lot of the time - like through the whole of 2005, 2010 and 2011.
It also shows some "weeks" only lasting for a day or so. Week 1 in 2005 only lasted for one day for instance and week 2 started on January 2nd. The final week (53) in 2004 only lasted for 6 days. It also starts the week on Sunday and not Monday which is the usual start day.
It appears to start week 1 on January 1st and changes to week 2 on the following Sunday. This is not what most people would expect when they talk about week number.
Nathan Stricker
which is precisely why ISO 8601 was introduced.
DMan - I wasn't particulary trying to be sarcastic, although reading it again maybe it came over that way.
The point is that there is a lot of confusion over this and so a standard was introduced to try and resolve it and that is what many people use these days.
Your code has been marked as an answer and that may lead people searching these forums to believe that it will produce a result to the ISO standard. It doesn't.
Dave
Matt M Jacobsen
Thank’s for all your answers !
and thank’s to you DMan1 !
It was the DatePart function i needed.
I also think that the way of defining the first week of the year differs somewhat in different countries !
But anyway the Datepart function does the jobb !
R Shams
You can work it out fairly easily..
I think my number of days in a leap year is wrong (i can never remember) but it think it works about close enough anyway
Private Sub WhatWeek
Dim DOY As Integer = Now.DayOfYear ' Get the current day of year Dim NOD As Integer 'number of days in a year Dim NW As Integer = 52 'number of weeks in a year (might have to mess with this with leap years) Dim TY As Integer = Now.Year 'current year. for leap year checking Dim CW As Integer ' current week If Date.IsLeapYear(TY) = True ThenNOD = 365
ElseNOD = 366
End IfCW = DOY / NOD * NW
MsgBox(Format(CW,
"#"))End Sub
Its probably the wrong way to do it but i think it works. If you run that code exactly it should give you an answer of twelve. My check of outlook tells me its week 12 :)