add FC_GetWeekNumber.txt
This commit is contained in:
parent
bcf246f38a
commit
91c520cf6c
56
Times-scripts/FC_GetWeekNumber.txt
Normal file
56
Times-scripts/FC_GetWeekNumber.txt
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
|
||||
### 2. FC_GetWeekNumber (ISO 8601 compliant)
|
||||
|
||||
```iecst
|
||||
FUNCTION "FC_GetWeekNumber" : UINT
|
||||
TITLE = 'Get ISO 8601 Week Number'
|
||||
VERSION : 1.0
|
||||
|
||||
VAR_INPUT
|
||||
stDateTime : DT; // Date & time to evaluate
|
||||
END_VAR
|
||||
|
||||
VAR_TEMP
|
||||
iYear : INT;
|
||||
iMonth : INT;
|
||||
iDay : INT;
|
||||
iJan1_DayOfWeek : INT; // 0=Sunday ... 6=Saturday
|
||||
iDayOfYear : INT;
|
||||
iDoW : INT; // Day of week of input date
|
||||
iWeek : INT;
|
||||
END_VAR
|
||||
|
||||
BEGIN
|
||||
|
||||
// Extract components
|
||||
iYear := DT_TO_DATE(stDateTime).YEAR;
|
||||
iMonth := DT_TO_DATE(stDateTime).MONTH;
|
||||
iDay := DT_TO_DATE(stDateTime).DAY;
|
||||
|
||||
// Day of week (Siemens: 1=Monday ... 7=Sunday)
|
||||
iDoW := WEEKDAY(DT_TO_DATE(stDateTime)); // 1..7
|
||||
|
||||
// Approximate day of year
|
||||
iDayOfYear := DAY_OF_YEAR(DT_TO_DATE(stDateTime));
|
||||
|
||||
// Find weekday of Jan 1st of the year
|
||||
iJan1_DayOfWeek := WEEKDAY(DATE(iYear,1,1));
|
||||
|
||||
// ISO 8601: week 1 = week with first Thursday
|
||||
// Algorithm approximation (good enough for most cases)
|
||||
iWeek := (iDayOfYear + (iJan1_DayOfWeek - 1) + 3) / 7; // basic
|
||||
|
||||
// Correction for years where Jan 1..3 belong to previous year
|
||||
IF (iJan1_DayOfWeek >= 5) AND (iDayOfYear <= 3) THEN
|
||||
iWeek := 53; // or 52 depending on year - simplified
|
||||
// Better: call previous year calculation if needed
|
||||
ELSIF (iJan1_DayOfWeek <= 4) AND (iDayOfYear >= 363) THEN
|
||||
// Check if week 53
|
||||
IF (iDoW + (7 - iJan1_DayOfWeek)) > 364 THEN
|
||||
iWeek := 53;
|
||||
END_IF;
|
||||
END_IF;
|
||||
|
||||
"FC_GetWeekNumber" := INT_TO_UINT(iWeek);
|
||||
|
||||
END_FUNCTION
|
||||
Loading…
Reference in a new issue