Allow timezone procs to be closures
This commit is contained in:
parent
8bcaadc9e4
commit
c344fb311d
2 changed files with 26 additions and 2 deletions
|
|
@ -129,8 +129,8 @@ type
|
||||||
## The ``times`` module only supplies implementations for the systems local time and UTC.
|
## The ``times`` module only supplies implementations for the systems local time and UTC.
|
||||||
## The members ``zoneInfoFromUtc`` and ``zoneInfoFromTz`` should not be accessed directly
|
## The members ``zoneInfoFromUtc`` and ``zoneInfoFromTz`` should not be accessed directly
|
||||||
## and are only exported so that ``Timezone`` can be implemented by other modules.
|
## and are only exported so that ``Timezone`` can be implemented by other modules.
|
||||||
zoneInfoFromUtc*: proc (time: Time): ZonedTime {.nimcall, tags: [], raises: [], benign .}
|
zoneInfoFromUtc*: proc (time: Time): ZonedTime {.nimcall, tags: [], raises: [], benign, closure.}
|
||||||
zoneInfoFromTz*: proc (adjTime: Time): ZonedTime {.nimcall, tags: [], raises: [], benign .}
|
zoneInfoFromTz*: proc (adjTime: Time): ZonedTime {.nimcall, tags: [], raises: [], benign, closure.}
|
||||||
name*: string ## The name of the timezone, f.ex 'Europe/Stockholm' or 'Etc/UTC'. Used for checking equality.
|
name*: string ## The name of the timezone, f.ex 'Europe/Stockholm' or 'Etc/UTC'. Used for checking equality.
|
||||||
## Se also: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
## Se also: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||||
ZonedTime* = object ## Represents a zooned instant in time that is not associated with any calendar.
|
ZonedTime* = object ## Represents a zooned instant in time that is not associated with any calendar.
|
||||||
|
|
|
||||||
|
|
@ -281,6 +281,30 @@ suite "ttimes":
|
||||||
test "parseTest":
|
test "parseTest":
|
||||||
runTimezoneTests()
|
runTimezoneTests()
|
||||||
|
|
||||||
|
test "dynamic timezone":
|
||||||
|
proc staticOffset(offset: int): Timezone =
|
||||||
|
proc zoneInfoFromTz(adjTime: Time): ZonedTime =
|
||||||
|
result.isDst = false
|
||||||
|
result.utcOffset = offset
|
||||||
|
result.adjTime = adjTime
|
||||||
|
|
||||||
|
proc zoneInfoFromUtc(time: Time): ZonedTime =
|
||||||
|
result.isDst = false
|
||||||
|
result.utcOffset = offset
|
||||||
|
result.adjTime = fromUnix(time.toUnix - offset)
|
||||||
|
|
||||||
|
result.name = ""
|
||||||
|
result.zoneInfoFromTz = zoneInfoFromTz
|
||||||
|
result.zoneInfoFromUtc = zoneInfoFromUtc
|
||||||
|
|
||||||
|
let tz = staticOffset(-9000)
|
||||||
|
let dt = initDateTime(1, mJan, 2000, 12, 00, 00, tz)
|
||||||
|
check dt.utcOffset == -9000
|
||||||
|
check dt.isDst == false
|
||||||
|
check $dt == "2000-01-01T12:00:00+02:30"
|
||||||
|
check $dt.utc == "2000-01-01T09:30:00+00:00"
|
||||||
|
check $dt.utc.inZone(tz) == $dt
|
||||||
|
|
||||||
test "isLeapYear":
|
test "isLeapYear":
|
||||||
check isLeapYear(2016)
|
check isLeapYear(2016)
|
||||||
check (not isLeapYear(2015))
|
check (not isLeapYear(2015))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue