Created
September 10, 2020 12:36
-
-
Save pietroppeter/e6afa43318b202ef2a2a32e0fd3844bf to your computer and use it in GitHub Desktop.
isoweek number in nim
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## 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