Hallo Thomas,
ich bastel gerade an eine Anwendung mit Kalenderwochen und bin auch über den Format$ / ww Bug gestolpert. Im Notes.net habe ich folgende @Formel, um die KW zu berechnen, gefunden:
Ich benutze Sie in der Vorgabe eines Feldes. Wenn ich das Doc aufmache zeigt er mir immer die aktuelle KW an.
D:=@Now kannst du ja mit deinem Montag ersetzen.
--------------------------------------------------------------
D := @Now;
FirstOfYear := @Date(@Year(D); 1; 1);
LastOfYear := @Date(@Year(D); 12; 31);
FirstDayNum := @Weekday(FirstOfYear);
LastDayNum := @Weekday(LastOfYear);
REM {ISO weeks start on Monday and ends on Sunday.};
ISOFirstDayNum := @If(FirstDayNum = 1; 7; FirstDayNum - 1);
ISOLastDayNum := @If(LastDayNum = 1; 7; LastDayNum - 1);
REM {The first and last ISO week is the first};
REM {and last ISO week to include Thursday};
IsFirstWeek := 7 - ISOFirstDayNum > 2;
IsLastWeek := 7 - ISOLastDayNum < 4;
REM {The date of the first day of the first ISO week};
ISOFirstDay := @If(IsFirstWeek;
@Adjust(FirstOfYear; 0; 0; 1 - ISOFirstDayNum; 0; 0; 0);
@Adjust(FirstOfYear; 0; 0; 8 - ISOFirstDayNum; 0; 0; 0));
REM {The date of the last day of the last ISO week};
ISOLastDay := @If(IsLastWeek;
@Adjust(LastOfYear; 0; 0; 7 - ISOLastDayNum; 0; 0; 0);
@Adjust(LastOfYear; 0; 0; -ISOLastDayNum; 0; 0; 0));
REM {Date outside ISOFirstDay and ISOlastDay};
REM {are from the previous or next year};
REM {Return the ISO week number and exit};
FirstWeekNextYear := @If(D > ISOLastDay; @Return(@Prompt([Ok]; "FWNY";
@Text(@Year(D)+1) + "W01")); NULL);
REM {I suspect this is where Julian dates would be useful};
REM {A recursive call could be used in a real language};
LastWeekLastYear := (D - @Adjust(FirstOfYear; -1; 0; 0; 0; 0; 0))/60/60/24/7;
AdjustLastWeek := 1 - (LastWeekLastYear - @Integer(LastWeekLastYear));
@Set("LastWeekLastYear"; LastWeekLastYear + AdjustLastWeek);
@If(D < ISOFirstDay;
@Return(@Prompt([Ok]; "LWLY"; @Text(@Year(D) - 1) + "W" +
@Text(LastWeekLastYear))); NULL);
REM {If you get this far, the date falls into an ISO week this year};
REM {Convert the difference in seconds to weeks};
NumWeeks := (D - ISOFirstDay)/60/60/24/7;
REM {Fractions indicate that the date falls};
REM {in the middle of the ISO week};
WeekAdjust := 1 - (NumWeeks - @Integer(NumWeeks));
ISOWeekNum := NumWeeks + WeekAdjust;
REM {Conform to ISO 8601 format};
Pad:=@If(ISOWeekNum<10;"0";"");
Result := @Text(ISOWeekNum);
Result
----------------------------
Hab noch ein Script der mir bei Auswahl der KW das jeweilige Datum für den Montag-Sonntag ausspuckt. Bei Interesse einfach melden.
ciao, Laurent
ps: der 4.Januar ist immer KW1
:pint: