summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorDmitry Polienko <dmitry@eldis.ru>2016-12-06 14:16:00 +0700
committerDmitry Polienko <dmitry@eldis.ru>2016-12-06 14:53:48 +0700
commitdc8ee72eb6069c181621a3dc4ad97f8cced9db4b (patch)
treebc72f4453ce28e2900505127286bf2066f87f3e7 /lib
parent50a1267b7d028f18df39523fd90399f0751180a4 (diff)
downloadNim-dc8ee72eb6069c181621a3dc4ad97f8cced9db4b.tar.gz
Revert @endragor's fix for Windows
_mkgmtime is not supported by mingw because of the older msvcrt
versions. Fortunately, mktime implementation in Windows is just broken
enough to make the initial implementation work...

As far as I can tell, this works with both *nix-like platforms
and Win, and fixes #4690
Diffstat (limited to 'lib')
-rw-r--r--lib/pure/times.nim30
1 files changed, 16 insertions, 14 deletions
diff --git a/lib/pure/times.nim b/lib/pure/times.nim
index e5b4f383f..cf4e7dde6 100644
--- a/lib/pure/times.nim
+++ b/lib/pure/times.nim
@@ -436,10 +436,8 @@ when not defined(JS):
     TimeInfoPtr = ptr StructTM
     Clock {.importc: "clock_t".} = distinct int
 
-  when defined(windows):
-    proc timegm(t: StructTM): Time {.
-      importc: "_mkgmtime", header: "<time.h>", tags: [].}
-  else:
+  when not defined(windows):
+    # This is not ANSI C, but common enough
     proc timegm(t: StructTM): Time {.
       importc: "timegm", header: "<time.h>", tags: [].}
 
@@ -522,18 +520,22 @@ when not defined(JS):
     # the conversion is not expensive
 
   proc timeInfoToTime(timeInfo: TimeInfo): Time =
-    var cTimeInfo = timeInfo # for C++ we have to make a copy,
-    # because the header of timegm is broken in my version of libc
-    result = timegm(timeInfoToTM(cTimeInfo))
-    # As timeInfoToTM does ignore the timezone, we need to adjust this here.
-    result = Time(TimeImpl(result) + timeInfo.timezone)
+    toTime(timeInfo)
 
   proc toTime(timeInfo: TimeInfo): Time =
-    var cTimeInfo = timeInfo # for C++ we have to make a copy,
-    # because the header of timegm is broken in my version of libc
-    result = timegm(timeInfoToTM(cTimeInfo))
-    # As timeInfoToTM does ignore the timezone, we need to adjust this here.
-    result = Time(TimeImpl(result) + timeInfo.timezone)
+    var cTimeInfo = timeInfo # for C++ we have to make a copy
+    # because the header of mktime is broken in my version of libc
+
+    when defined(windows):
+      # On Windows `mktime` is broken enough to make this work.
+      result = mktime(timeInfoToTM(cTimeInfo))
+      # mktime is defined to interpret the input as local time. As timeInfoToTM
+      # does ignore the timezone, we need to adjust this here.
+      result = Time(TimeImpl(result) - getTimezone() + timeInfo.timezone)
+    else:
+      result = timegm(timeInfoToTM(cTimeInfo))
+      # As timeInfoToTM does ignore the timezone, we need to adjust this here.
+      result = Time(TimeImpl(result) + timeInfo.timezone)
 
   const
     epochDiff = 116444736000000000'i64