For a given date you want
to determine the week 1...53 and the year corresponding to this
week. The date is specified in one of the external date formats
(like dd.mm.yyyy or mm/dd/yyyy).
For example, 01.01.2003 is in week 1 of the year 2003. This sounds
self-evident, but (surprisingly):
01.01.2005 is in week 53 of the year 2004
31.12.2003 is in week 1 of the year 2004
The rule is: a week is considered to be in the year that contains 4
days or more of the week. A week always starts with Monday.
Solution 1 (Function call)
GuiXT
// sample value
// any date in valid date format:
// d.m.y, m/d/y, m-d-y, y.m.d, y/m/d, y-m-d
Set V[mydate] "01.01.2021"
// use date calculations to force format YYYYMMDD
Set V[diff] "&V[mydate]" - "01.01.1900"
Set V[d] "01.01.1900" + "&V[diff]"
Set V[yyyymmdd] "&V[d](7-10)&V[d](4-5)&V[d](1-2)"
// Determine week
call "DATE_GET_WEEK" in.DATE="&V[yyyymmdd]" out.WEEK="yearweek"
Set V[year] "&V[yearweek](1-4)"
Set V[week] "&V[yearweek](5-6)"
Message "&V[mydate] is in week &V[week] of the year &V[year]"
Sample
message 1
Solution 2 (Date calculations)
GuiXT
// sample value
// any date in valid date format:
// d.m.y, m/d/y, m-d-y, y.m.d, y/m/d, y-m-d
Set V[mydate] "01.01.2021"
// Get date in format dd.mm.yyyy, to avoid handling all different date formats
Set V[reldate] "&V[mydate]" - "01.01.1000"
Set V[date] "01.01.1000" + "&V[reldate]"
Set V[year] "&V[date](7-10)"
label compute_week
// Get start of 1st week
Set V[firstweek] "01.01.&V[year]" / 7 decimals=0
Set V[firstweek] "&V[firstweek]" * 7
// Get week number
Set V[week] "&V[date]" * 1
Set V[week] "&V[week]" - "&V[firstweek]"
Set V[week] "&V[week]" + 4
Set V[week] "&V[week]" / 7 decimals=0
// Last week of previous year? (can be 52 or 53)
if V[week=0]
Set V[year] "&V[year]" - 1
Set V[date] "31.12.&V[year]"
goto compute_week
endif
// ... or first week of following year?
if V[week=53]
Set V[lastweek] "&V[firstweek]" + 364
if V[lastweek>28.12.&V[year]]
Set V[year] "&V[year]" + 1
Set V[week] 1
endif
endif
Message "&V[mydate] is in week &V[week] of the year &V[year]"