Skip to content

Instantly share code, notes, and snippets.

@pietroppeter
Created September 10, 2020 12:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pietroppeter/e6afa43318b202ef2a2a32e0fd3844bf to your computer and use it in GitHub Desktop.
Save pietroppeter/e6afa43318b202ef2a2a32e0fd3844bf to your computer and use it in GitHub Desktop.
isoweek number in nim
## iso week number
## see https://en.wikipedia.org/wiki/ISO_week_date#Calculating_the_week_number_of_a_given_date
import times
type
WeekRange = range[1 .. 53]
proc lastWeek(year: int): WeekRange =
## The long years, with 53 weeks in them, can be described as any year starting on Thursday and any leap year starting on Wednesday
let firstWeekDay = initDateTime(1.MonthDayRange, mJan, year, 0, 0, 0).weekday
if firstWeekDay == dThu or (year.isLeapYear and firstWeekDay == dWed):
53
else:
52
proc isoweek*(dt: DateTime): WeekRange =
## returns isoweek for a given date
let
od = getDayOfYear(dt.monthday, dt.month, dt.year) + 1 # ordinal date
week = (od - dt.weekday.ord + 9) div 7
if week < 1:
lastWeek(dt.year - 1)
elif week > lastWeek(dt.year):
1
else:
week
when isMainModule:
doAssert initDateTime(23, mDec, 2019, 0, 0, 0).isoweek == 52
doAssert initDateTime(30, mDec, 2019, 0, 0, 0).isoweek == 1
doAssert initDateTime(2, mFeb, 2020, 0, 0, 0).isoweek == 5
doAssert initDateTime(3, mFeb, 2020, 0, 0, 0).isoweek == 6
echo "current isoweek: ", now().isoweek
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment