Based on the description here: https://en.wikipedia.org/wiki/ISO_week_date,
I guess the essence of the ISO 8601 definition is:
- a week starts on Monday
- week 01 is the week with the first Thursday of the year
- a week belongs to the year in which the majority of its days is in
- years starting or ending on Thurdays have 53 weeks, others have 52 weeks
Code:
### correct week number according to ISO 8601
reset session
dow(t) = int(tm_wday(t)) ? tm_wday(t) : 7 # day of week 1=Mon, ..., 7=Sun
week(t) = int((11 + tm_yday(t) - dow(t))/7) # "raw"week of year
wday(d,m,y) = tm_wday(strptime("%d.%m.%Y",sprintf("%02d.%02d.%04d",d,m,y))) # week day of certain date
wpy(y) = wday(1,1,y)==4 || wday(31,12,y)==4 ? 53 : 52 # weeks per year
woy(t) = week(t) < 1 ? wpy(tm_year(t)-1) :
week(t) > wpy(tm_year(t)) ? 1 : week(t) # week of year
yow(t) = int(week(t) < 1 ? tm_year(t)-1 : week(t) > wpy(tm_year(t)) ?
tm_year(t)+1 : tm_year(t)) # year of week (could be previous, current or next)
StartDate = "24.12.2020"
myTimeFmt = "%d.%m.%Y"
SecondsPerDay = 3600*24
print " date %a DoW %d %j YoW WoY"
print "======================================"
do for [i=0:20] {
t = strptime(myTimeFmt,StartDate) + i*SecondsPerDay
myDate = strftime(myTimeFmt." %a", t)
myDate2 = strftime("%d %j", t)
print sprintf("%s %02d %s %04d-W%02d", myDate, dow(t), myDate2, yow(t), woy(t))
}
### end of code
Result:
date %a DoW %d %j YoW WoY
======================================
24.12.2020 Thu 04 24 359 2020-W52
25.12.2020 Fri 05 25 360 2020-W52
26.12.2020 Sat 06 26 361 2020-W52
27.12.2020 Sun 07 27 362 2020-W52
28.12.2020 Mon 01 28 363 2020-W53
29.12.2020 Tue 02 29 364 2020-W53
30.12.2020 Wed 03 30 365 2020-W53
31.12.2020 Thu 04 31 366 2020-W53
01.01.2021 Fri 05 01 001 2020-W53
02.01.2021 Sat 06 02 002 2020-W53
03.01.2021 Sun 07 03 003 2020-W53
04.01.2021 Mon 01 04 004 2021-W01
05.01.2021 Tue 02 05 005 2021-W01
06.01.2021 Wed 03 06 006 2021-W01
07.01.2021 Thu 04 07 007 2021-W01
08.01.2021 Fri 05 08 008 2021-W01
09.01.2021 Sat 06 09 009 2021-W01
10.01.2021 Sun 07 10 010 2021-W01
11.01.2021 Mon 01 11 011 2021-W02
12.01.2021 Tue 02 12 012 2021-W02
13.01.2021 Wed 03 13 013 2021-W02
In order to use the week numbers, e.g. as time axis labels it would be ideal to have this implemented for %W
. Accidentially, there was a recent bug report on SourceForge.
So, I assume it will be fixed pretty soon in one of the next versions.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…