DateTime.DateFormat = "dd.MM.yyyy"
Log(GetWeekNumberStartingFromMonday(DateTime.DateParse("03.01.2021")))
Sub GetWeekNumberStartingFromMonday (ticks As Long) As Int
Dim firstdayOffset As Int = DateTime.GetDayOfWeek(DateUtils.SetDate( _
DateTime.GetYear(ticks), 1, 1)) - 2
If firstdayOffset < 0 Then firstdayOffset = firstdayOffset + 7
Return Floor((DateTime.GetDayOfYear(ticks) - 1 + firstdayOffset) / 7) + 1
End Sub
Sorry, that's not entirely correct for some cases:January 1 always falls on week number 1.
Kalenderwoche
Das Kalenderjahr umfasst mindestens 52 Wochen, die v. a. im Geschäftsleben als Kalenderwochen (KW) durchnummeriert werden, wobei es für die Wochen-Nummerierung verschiedene Definitionen gibt. Je nach angewandter Regel kann die erste Woche eines Jahres unterschiedlich festgelegt sein:
- Im deutschsprachigen Raum, gemäß Normen der ISO, DIN, ÖNORM und SN: jene Woche, die den ersten Donnerstag des Jahres enthält (ISO 8601, früher DIN 1355-1). Da ISO 8601 den Montag als ersten Tag der Woche definiert, ist dies somit die erste Woche, von der mehr Tage (mindestens vier) auf das neue Jahr fallen als auf das alte Jahr. Äquivalent hierzu sind die folgenden Definitionen:
- jene Woche, die den 4. Januar enthält
- jene Woche, die den 1. Januar enthält, falls dieser ein Montag, Dienstag, Mittwoch oder Donnerstag ist, sonst die darauf folgende Woche
Sub AppStart (Args() As String)
DateTime.DateFormat = "dd.MM.yyyy"
Log(GetWeekNumberStartingFromMonday(DateTime.DateParse("01.01.2021")))
Log(GetWeekNumberStartingFromMonday(DateTime.DateParse("02.01.2021")))
Log(GetWeekNumberStartingFromMonday(DateTime.DateParse("03.01.2021")))
Log(GetWeekNumberStartingFromMonday(DateTime.DateParse("04.01.2021")))
Log(GetWeekNumberStartingFromMonday(DateTime.DateParse("05.01.2021")))
End Sub
Sub GetWeekNumberStartingFromMonday (ticks As Long) As Int
Dim WeekDayOfFirstDayOfYear As Int = DateTime.GetDayOfWeek(DateUtils.SetDate(DateTime.GetYear(ticks), 1, 1)) - 1
Dim FirstMondayInYear As Int = (7 + WeekDayOfFirstDayOfYear - 1) Mod 7
Dim result As Int
If WeekDayOfFirstDayOfYear <> 1 Then result = result - 1
result = result + Floor((DateTime.GetDayOfYear(ticks) - 1 + FirstMondayInYear) / 7) + 1
Return result
End Sub
/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
* @param date Date - the date to get the week for
* @return number - the number of the week within the year that contains this date
*/
iso8601Week: function( date ) {
var time,
checkDate = new Date( date.getTime() );
// Find Thursday of this week starting on Monday
checkDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );
time = checkDate.getTime();
checkDate.setMonth( 0 ); // Compare with Jan 1
checkDate.setDate( 1 );
return Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;
}
Sub GetWeekNumberStartingFromMonday (ticks As Long) As Int
Dim WeekDayOfFirstDayOfYear As Int = DateTime.GetDayOfWeek(DateUtils.SetDate(DateTime.GetYear(ticks), 1, 1)) - 1
Dim FirstMondayInYear As Int = (7 + WeekDayOfFirstDayOfYear - 1) Mod 7
Dim result As Int
If WeekDayOfFirstDayOfYear <> 1 Then result = result - 1
result = result + Floor((DateTime.GetDayOfYear(ticks) - 1 + FirstMondayInYear) / 7) + 1
Return result
End Sub
This works as expected. You should treat 0 as week 53 of the previous year, if it returned 53 then you wouldn't know whether it is 53 of this year or the previous one.The following code does not work. With the date from today, the KW is alredy one week to low. The sub makes the right cut to the 04.01.2021, but the 01. to 03.01. must be KW 53, not 0
Sub AppStart (Args() As String)
DateTime.DateFormat = "dd.MM.yyyy"
Dim start As Long = DateUtils.SetDate(2020, 1, 1)
For i = 0 To 350
Dim p As Period
p.Days = i
Dim t As Long = DateUtils.AddPeriod(start, p)
If DateTime.GetDayOfWeek(t) = 2 Then
Log("********************")
End If
Log($"$Date{t}: Week #${GetWeekNumberStartingFromMonday(t)}, Day: ${DateUtils.GetDayOfWeekName(t)}"$)
Next
End Sub
Sub GetWeekNumberStartingFromMonday (ticks As Long) As Int
Dim WeekDayOfFirstDayOfYear As Int = DateTime.GetDayOfWeek(DateUtils.SetDate(DateTime.GetYear(ticks), 1, 1)) - 1
Dim FirstMondayInYear As Int = (7 + WeekDayOfFirstDayOfYear - 1) Mod 7
Dim result As Int
If WeekDayOfFirstDayOfYear <> 1 Then result = result - 1
result = result + Floor((DateTime.GetDayOfYear(ticks) - 1 + FirstMondayInYear) / 7) + 1
Return result
End Sub
The sub works until 2024. In 2025 and 2026, the weeknumber is again one week to low for each date
Sub GetWeeekNumberISO8601(Datum As Long) As Int
Jahr=DateTime.GetYear(Datum)
Dim ErsterTagdesJahres As String = "01.01." & Jahr
Dim fdy As Int = GetWeekDay(DateTime.DateParse(ErsterTagdesJahres)) 'Wochetag für den 01.01. ermitteln
Dim TagdesJahres As Int = DateTime.GetDayOfYear(Datum) '1. // Anzahl der Tage im Jahr ermitteln
Dim p As Period
p.Days = -((DateTime.GetDayOfWeek(Datum)+5) Mod 7) 'change to 5 to start the week from Monday
Dim WochenTag As Int = (-p.Days)+1 '2. // Wochentag ermitteln
'
KW=((7-fdy)+(TagdesJahres-WochenTag+7))/7 '3. // die Wochennummer ohne Sonderfall berechnen
Select KW
Case 0 '4. // wenn die Wochennummer 0 ergibt, dann liegt der Tag am Anfang des Jahres (1. Sonderfall)
WochenTag = GetWeekDay(DateTime.DateParse("31.12." & (Jahr-1))) '5. // den letzten Wochentag aus dem Vorjahr ermitteln
If DateTime.GetDayOfYear(DateTime.DateParse("31.12." & (Jahr-1)))=366 Then '6. // ermitteln, ob es sich beim Vorjahr um ein Schaltjahr handelt
Dim LeapYear As Boolean=True
Else
Dim LeapYear As Boolean=False
End If '7. // und nach dem Switch weitermachen...
Case 52,53
'Hier muss geklärt werden, ob der 31.12. überhaupt in dieser Woche liegt: '8. // wenn die Wochennummer 52 oder 53 ergibt, dann liegt der Tag am Ende des Jahres (2. Sonderfall)
If IncludesEndofYear(Datum)= True Then
WochenTag = GetWeekDay(DateTime.DateParse("31.12." & (Jahr))) '9. // den letzten Wochentag aus diesem Jahr ermitteln
If DateTime.GetDayOfYear(DateTime.DateParse("31.12." & (Jahr)))=366 Then '10.// ermitteln, ob es sich bei diesem Jahr um ein Schaltjahr handelt
Dim LeapYear As Boolean=True
Else
Dim LeapYear As Boolean=False
End If
Else
Return KW
End If '11.// und nach dem Switch weitermachen...
Case Else '12.// in den anderen Faellen kann die Funktion hier verlassen und die Wochennummer zurueckgegeben werden
Return KW
End Select
If WochenTag < 4 Then '14.// wenn der 31.12. vor dem Donnerstag liegt, dann...
KW = 1 '15.// ist das die erste Woche des Jahres
Else '16.// anderenfalls muss ermittelt werden, ob es eine 53. Woche gibt (3. Sonderfall)
'// wenn der letzte WochenTag auf einen Donnerstag oder,
'// in einem Schaltjahr, auf einen Donnerstag oder Freitag fällt,
'// dann ist das die 53. Woche, ansonsten die 52. Woche.
If WochenTag=4 Or LeapYear=True And WochenTag=5 Then
KW=53
Else
KW=52
End If
End If
Return KW
End Sub
Private Sub IncludesEndofYear(Datum As Long) As Boolean
Dim p As Period
p.Days = -((DateTime.GetDayOfWeek(Datum)+5) Mod 7) 'change to 5 to start the week from Monday
Dim FirstDay As Long = Datum + DateTime.TicksPerDay*p.Days
Dim LastDay As Long = FirstDay + WochenPeriode
'Log("Erster Tag der Woche: " & DateTime.Date(FirstDay))
'Log("Letzter Tag der Woche: " & DateTime.Date(LastDay))
If LastDay>=DateTime.DateParse("31.12." & (Jahr)) Then
Return True
Else
Return False
End If
End Sub
Private Sub GetWeekDay(DatumS As Long) As Int
DateTime.DateFormat = "dd.MM.yyyy"
Dim p As Period
p.Days = -((DateTime.GetDayOfWeek(DatumS)+5) Mod 7) 'change to 5 to start the week from Monday
Return ((-p.Days)+1)
End Sub
********************
30.12.2019: Week #1, Day: Montag
31.12.2019: Week #1, Day: Dienstag
01.01.2020: Week #1, Day: Mittwoch
02.01.2020: Week #1, Day: Donnerstag
03.01.2020: Week #1, Day: Freitag
04.01.2020: Week #1, Day: Samstag
05.01.2020: Week #1, Day: Sonntag
********************
06.01.2020: Week #2, Day: Montag
07.01.2020: Week #2, Day: Dienstag
08.01.2020: Week #2, Day: Mittwoch
09.01.2020: Week #2, Day: Donnerstag
10.01.2020: Week #2, Day: Freitag
11.01.2020: Week #2, Day: Samstag
12.01.2020: Week #2, Day: Sonntag
********************
13.01.2020: Week #3, Day: Montag
14.01.2020: Week #3, Day: Dienstag
15.01.2020: Week #3, Day: Mittwoch
16.01.2020: Week #3, Day: Donnerstag
17.01.2020: Week #3, Day: Freitag
18.01.2020: Week #3, Day: Samstag
19.01.2020: Week #3, Day: Sonntag
********************
20.01.2020: Week #4, Day: Montag
21.01.2020: Week #4, Day: Dienstag
22.01.2020: Week #4, Day: Mittwoch
Sub isoGetWeekOfYear(ticks As Long) As Int
Dim offset As Int = 0
Dim FirstDay As Long = DateUtils.SetDate(DateTime.GetYear(ticks), 1, 1)
If DateTime.GetDayOfWeek(FirstDay) >5 Then ' is Thursday in Week?
Do While(DateTime.GetDayOfWeek(FirstDay) <> 1) ' Find first Sunday
FirstDay=DateTime.Add (FirstDay,0,0,1)
offset=offset-1
Loop
Else
Do While(DateTime.GetDayOfWeek(FirstDay) <> 1) 'Find first Sunday
FirstDay=DateTime.Add (FirstDay,0,0,-1)
offset=offset+1
Loop
End If
Return Floor((DateTime.GetDayOfYear(ticks) + offset) / 7) +1
End Sub
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?