summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorTimothee Cour <timothee.cour2@gmail.com>2020-03-01 12:56:20 -0800
committerGitHub <noreply@github.com>2020-03-01 21:56:20 +0100
commit22d1ba4be76569d1df96cc8bfed47fccfc833019 (patch)
tree5f8b72dcba8a37362b15de7eac7504be021f758a
parent525ab5a497d1b998bc67c5b1225db3556ac77d27 (diff)
downloadNim-22d1ba4be76569d1df96cc8bfed47fccfc833019.tar.gz
fixes #13543 and added times.isLeapDay (#13547)
-rw-r--r--changelog.md1
-rw-r--r--lib/pure/times.nim13
-rw-r--r--tests/stdlib/ttimes.nim10
3 files changed, 21 insertions, 3 deletions
diff --git a/changelog.md b/changelog.md
index f106ac2c2..e0fd64942 100644
--- a/changelog.md
+++ b/changelog.md
@@ -81,6 +81,7 @@
 
 
 ```
+- Added `times.isLeapDay`
 
 
 ## Library changes
diff --git a/lib/pure/times.nim b/lib/pure/times.nim
index 3fc4d69df..92b6cd3b7 100644
--- a/lib/pure/times.nim
+++ b/lib/pure/times.nim
@@ -637,6 +637,19 @@ proc isLeapYear*(year: int): bool =
     doAssert not isLeapYear(1900)
   year mod 4 == 0 and (year mod 100 != 0 or year mod 400 == 0)
 
+proc isLeapDay*(t: DateTime): bool {.since: (1,1).} =
+  ## returns whether `t` is a leap day, ie, Feb 29 in a leap year. This matters
+  ## as it affects time offset calculations.
+  runnableExamples:
+    let t = initDateTime(29, mFeb, 2020, 00, 00, 00, utc())
+    doAssert t.isLeapDay
+    doAssert t+1.years-1.years != t
+    let t2 = initDateTime(28, mFeb, 2020, 00, 00, 00, utc())
+    doAssert not t2.isLeapDay
+    doAssert t2+1.years-1.years == t2
+    doAssertRaises(Exception): discard initDateTime(29, mFeb, 2021, 00, 00, 00, utc())
+  t.year.isLeapYear and t.month == mFeb and t.monthday == 29
+
 proc getDaysInMonth*(month: Month, year: int): int =
   ## Get the number of days in ``month`` of ``year``.
   # http://www.dispersiondesign.com/articles/time/number_of_days_in_a_month
diff --git a/tests/stdlib/ttimes.nim b/tests/stdlib/ttimes.nim
index 97945b21d..0602aaa94 100644
--- a/tests/stdlib/ttimes.nim
+++ b/tests/stdlib/ttimes.nim
@@ -345,20 +345,24 @@ suite "ttimes":
   test "adding/subtracting TimeInterval":
     # add/subtract TimeIntervals and Time/TimeInfo
     let now = getTime().utc
+    let isSpecial = now.isLeapDay
     check now + convert(Seconds, Nanoseconds, 1).nanoseconds == now + 1.seconds
     check now + 1.weeks == now + 7.days
     check now - 1.seconds == now - 3.seconds + 2.seconds
     check now + 65.seconds == now + 1.minutes + 5.seconds
     check now + 60.minutes == now + 1.hours
     check now + 24.hours == now + 1.days
-    check now + 13.months == now + 1.years + 1.months
+    if not isSpecial:
+      check now + 13.months == now + 1.years + 1.months
     check toUnix(fromUnix(0) + 2.seconds) == 2
     check toUnix(fromUnix(0) - 2.seconds) == -2
     var ti1 = now + 1.years
     ti1 = ti1 - 1.years
-    check ti1 == now
+    if not isSpecial:
+      check ti1 == now
     ti1 = ti1 + 1.days
-    check ti1 == now + 1.days
+    if not isSpecial:
+      check ti1 == now + 1.days
 
     # Bug with adding a day to a Time
     let day = 24.hours