Implemented changes suggested by dom96
* Removed extraneous exports (and converted const array to separate consts) * Renamed dayOfWeek, dayOfWeekJulian to getDayOfWeek and getDayOfWeekJulian * Renamed decodeTime procs to timeToTimeInfo and timeToTimeInterval * Added some basic descriptions to docs
This commit is contained in:
parent
a2f0fe03b6
commit
5e0b8d5ef6
1 changed files with 38 additions and 41 deletions
|
|
@ -1054,32 +1054,27 @@ proc countLeapYears(yearSpan: int): int =
|
||||||
proc countDays(yearSpan: int): int =
|
proc countDays(yearSpan: int): int =
|
||||||
(yearSpan - 1) * 365 + countLeapYears(yearSpan)
|
(yearSpan - 1) * 365 + countLeapYears(yearSpan)
|
||||||
|
|
||||||
# counts the number of years spanned by a given number of days.
|
|
||||||
proc countYears(daySpan: int): int =
|
proc countYears(daySpan: int): int =
|
||||||
|
# counts the number of years spanned by a given number of days.
|
||||||
((daySpan - countLeapYears(daySpan div 365)) div 365)
|
((daySpan - countLeapYears(daySpan div 365)) div 365)
|
||||||
|
|
||||||
proc countYearsAndDays(daySpan: int): tuple[years: int, days: int] =
|
proc countYearsAndDays(daySpan: int): tuple[years: int, days: int] =
|
||||||
|
# counts the number of years spanned by a given number of days and the remainder as days.
|
||||||
let days = daySpan - countLeapYears(daySpan div 365)
|
let days = daySpan - countLeapYears(daySpan div 365)
|
||||||
result.years = days div 365
|
result.years = days div 365
|
||||||
result.days = days mod 365
|
result.days = days mod 365
|
||||||
|
|
||||||
type
|
const
|
||||||
SecondScale* = enum ssMinute, ssHour, ssDay, ssMonth, ssYear
|
secondsInMin = 60
|
||||||
|
secondsInHour = 60*60
|
||||||
# these are very approximate beyond day
|
secondsInDay = 60*60*24
|
||||||
const secondsIn*: array[SecondScale.low..SecondScale.high, int] =[
|
|
||||||
60, # minute
|
|
||||||
60*60, # hour
|
|
||||||
60*60*24, # day
|
|
||||||
60*60*24*30, # month (estimate)
|
|
||||||
60*60*24*30*12] # year (estimate)
|
|
||||||
|
|
||||||
const
|
const
|
||||||
epochStartYear = 1970
|
epochStartYear = 1970
|
||||||
leapYearsSinceEpoch* = countLeapYears(epochStartYear)
|
leapYearsSinceEpoch = countLeapYears(epochStartYear)
|
||||||
|
|
||||||
proc dayOfWeek*(day, month, year: int): WeekDay =
|
proc getDayOfWeek*(day, month, year: int): WeekDay =
|
||||||
# This is for the Gregorian calendar
|
## Returns the day of the week enum from day, month and year.
|
||||||
# Day & month start from one.
|
# Day & month start from one.
|
||||||
let
|
let
|
||||||
a = (14 - month) div 12
|
a = (14 - month) div 12
|
||||||
|
|
@ -1091,8 +1086,8 @@ proc dayOfWeek*(day, month, year: int): WeekDay =
|
||||||
if d == 0: return dSun
|
if d == 0: return dSun
|
||||||
result = (d-1).WeekDay
|
result = (d-1).WeekDay
|
||||||
|
|
||||||
proc dayOfWeekJulian*(day, month, year: int): WeekDay =
|
proc getDayOfWeekJulian*(day, month, year: int): WeekDay =
|
||||||
# This is for the Julian calendar
|
## Returns the day of the week enum from day, month and year, according to the Julian calender.
|
||||||
# Day & month start from one.
|
# Day & month start from one.
|
||||||
let
|
let
|
||||||
a = (14 - month) div 12
|
a = (14 - month) div 12
|
||||||
|
|
@ -1101,11 +1096,12 @@ proc dayOfWeekJulian*(day, month, year: int): WeekDay =
|
||||||
d = (5 + day + y + (y div 4) + (31*m) div 12) mod 7
|
d = (5 + day + y + (y div 4) + (31*m) div 12) mod 7
|
||||||
result = d.WeekDay
|
result = d.WeekDay
|
||||||
|
|
||||||
proc decodeTime*(t: Time): TimeInfo =
|
proc timeToTimeInfo*(t: Time): TimeInfo =
|
||||||
|
## Converts a Time to TimeInfo.
|
||||||
let
|
let
|
||||||
daysSinceEpoch = t.int div secondsIn[ssDay]
|
daysSinceEpoch = t.int div secondsInDay
|
||||||
(yearsSinceEpoch, daysRemaining) = countYearsAndDays(daysSinceEpoch)
|
(yearsSinceEpoch, daysRemaining) = countYearsAndDays(daysSinceEpoch)
|
||||||
daySeconds = t.int mod secondsIn[ssDay]
|
daySeconds = t.int mod secondsInDay
|
||||||
|
|
||||||
y = yearsSinceEpoch + epochStartYear
|
y = yearsSinceEpoch + epochStartYear
|
||||||
|
|
||||||
|
|
@ -1125,17 +1121,18 @@ proc decodeTime*(t: Time): TimeInfo =
|
||||||
m = mon # month is zero indexed enum
|
m = mon # month is zero indexed enum
|
||||||
md = days
|
md = days
|
||||||
# NB: month is zero indexed but dayOfWeek expects 1 indexed.
|
# NB: month is zero indexed but dayOfWeek expects 1 indexed.
|
||||||
wd = dayOfWeek(days, mon.int + 1, y).Weekday
|
wd = getDayOfWeek(days, mon.int + 1, y).Weekday
|
||||||
h = daySeconds div secondsIn[ssHour] + 1
|
h = daySeconds div secondsInHour + 1
|
||||||
mi = (daySeconds mod secondsIn[ssHour]) div secondsIn[ssMinute]
|
mi = (daySeconds mod secondsInHour) div secondsInMin
|
||||||
s = daySeconds mod secondsIn[ssMinute]
|
s = daySeconds mod secondsInMin
|
||||||
result = TimeInfo(year: y, yearday: yd, month: m, monthday: md, weekday: wd, hour: h, minute: mi, second: s)
|
result = TimeInfo(year: y, yearday: yd, month: m, monthday: md, weekday: wd, hour: h, minute: mi, second: s)
|
||||||
|
|
||||||
proc decodeTimeInterval*(t: Time): TimeInterval =
|
proc timetoTimeInterval*(t: Time): TimeInterval =
|
||||||
|
## Converts a Time to a TimeInterval.
|
||||||
var
|
var
|
||||||
daysSinceEpoch = t.int div secondsIn[ssDay]
|
daysSinceEpoch = t.int div secondsInDay
|
||||||
(yearsSinceEpoch, daysRemaining) = countYearsAndDays(daysSinceEpoch)
|
(yearsSinceEpoch, daysRemaining) = countYearsAndDays(daysSinceEpoch)
|
||||||
daySeconds = t.int mod secondsIn[ssDay]
|
daySeconds = t.int mod secondsInDay
|
||||||
|
|
||||||
result.years = yearsSinceEpoch + epochStartYear
|
result.years = yearsSinceEpoch + epochStartYear
|
||||||
|
|
||||||
|
|
@ -1152,9 +1149,9 @@ proc decodeTimeInterval*(t: Time): TimeInterval =
|
||||||
|
|
||||||
result.months = mon.int + 1 # month is 1 indexed int
|
result.months = mon.int + 1 # month is 1 indexed int
|
||||||
result.days = days
|
result.days = days
|
||||||
result.hours = daySeconds div secondsIn[ssHour] + 1
|
result.hours = daySeconds div secondsInHour + 1
|
||||||
result.minutes = (daySeconds mod secondsIn[ssHour]) div secondsIn[ssMinute]
|
result.minutes = (daySeconds mod secondsInHour) div secondsInMin
|
||||||
result.seconds = daySeconds mod secondsIn[ssMinute]
|
result.seconds = daySeconds mod secondsInMin
|
||||||
# Milliseconds not available from Time
|
# Milliseconds not available from Time
|
||||||
|
|
||||||
when isMainModule:
|
when isMainModule:
|
||||||
|
|
@ -1239,18 +1236,18 @@ when isMainModule:
|
||||||
assert "15:04:00" in $s.parse(f)
|
assert "15:04:00" in $s.parse(f)
|
||||||
when not defined(testing):
|
when not defined(testing):
|
||||||
echo "Kitchen: " & $s.parse(f)
|
echo "Kitchen: " & $s.parse(f)
|
||||||
var ti = decodeTime(getTime())
|
var ti = timeToTimeInfo(getTime())
|
||||||
echo "Todays date after decoding: ", ti
|
echo "Todays date after decoding: ", ti
|
||||||
var tint = decodeTimeInterval(getTime())
|
var tint = timeToTimeInterval(getTime())
|
||||||
echo "Todays date after decoding to interval: ", tint
|
echo "Todays date after decoding to interval: ", tint
|
||||||
# checking dayOfWeek matches known days
|
# checking dayOfWeek matches known days
|
||||||
assert dayOfWeek(21, 9, 1900) == dFri
|
assert getDayOfWeek(21, 9, 1900) == dFri
|
||||||
assert dayOfWeek(1, 1, 1970) == dThu
|
assert getDayOfWeek(1, 1, 1970) == dThu
|
||||||
assert dayOfWeek(21, 9, 1970) == dMon
|
assert getDayOfWeek(21, 9, 1970) == dMon
|
||||||
assert dayOfWeek(1, 1, 2000) == dSat
|
assert getDayOfWeek(1, 1, 2000) == dSat
|
||||||
assert dayOfWeek(1, 1, 2021) == dFri
|
assert getDayOfWeek(1, 1, 2021) == dFri
|
||||||
# Julian tests
|
# Julian tests
|
||||||
assert dayOfWeekJulian(21, 9, 1900) == dFri
|
assert getDayOfWeekJulian(21, 9, 1900) == dFri
|
||||||
assert dayOfWeekJulian(21, 9, 1970) == dMon
|
assert getDayOfWeekJulian(21, 9, 1970) == dMon
|
||||||
assert dayOfWeekJulian(1, 1, 2000) == dSat
|
assert getDayOfWeekJulian(1, 1, 2000) == dSat
|
||||||
assert dayOfWeekJulian(1, 1, 2021) == dFri
|
assert getDayOfWeekJulian(1, 1, 2021) == dFri
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue