fix https://github.com/nim-lang/RFCs/issues/211: var a: DateTime compiles and is usable (#14002) [backport:1.2]

* fix https://github.com/nim-lang/RFCs/issues/211: `var a: DateTime` works
* assertValidDate checks for sentinel month

(cherry picked from commit e3919b658f)
This commit is contained in:
Timothee Cour
2020-04-18 07:22:03 -07:00
committed by narimiran
parent 9d667306df
commit dbf35e2ac3
2 changed files with 25 additions and 3 deletions

View File

@@ -260,6 +260,7 @@ type
Month* = enum ## Represents a month. Note that the enum starts at ``1``,
## so ``ord(month)`` will give the month number in the
## range ``1..12``.
# mInvalid = (0, "Invalid") # intentionally left out so `items` works
mJan = (1, "January")
mFeb = "February"
mMar = "March"
@@ -296,7 +297,8 @@ when defined(nimHasStyleChecks):
{.pop.}
type
MonthdayRange* = range[1..31]
MonthdayRange* = range[0..31]
## 0 represents an invalid day of the month
HourRange* = range[0..23]
MinuteRange* = range[0..59]
SecondRange* = range[0..60]
@@ -670,7 +672,7 @@ proc getDaysInYear*(year: int): int =
proc assertValidDate(monthday: MonthdayRange, month: Month, year: int)
{.inline.} =
assert monthday <= getDaysInMonth(month, year),
assert monthday > 0 and monthday <= getDaysInMonth(month, year),
$year & "-" & intToStr(ord(month), 2) & "-" & $monthday &
" is not a valid date"
@@ -1576,9 +1578,14 @@ proc `<=`*(a, b: DateTime): bool =
## Returns true if ``a`` happened before or at the same time as ``b``.
return a.toTime <= b.toTime
proc isDefault[T](a: T): bool =
system.`==`(a, default(T))
proc `==`*(a, b: DateTime): bool =
## Returns true if ``a`` and ``b`` represent the same point in time.
return a.toTime == b.toTime
if a.isDefault: b.isDefault
elif b.isDefault: false
else: a.toTime == b.toTime
proc isStaticInterval(interval: TimeInterval): bool =
interval.years == 0 and interval.months == 0 and