diff options
author | Dmitry Polienko <dmitry@eldis.ru> | 2016-12-06 14:16:00 +0700 |
---|---|---|
committer | Dmitry Polienko <dmitry@eldis.ru> | 2016-12-06 14:53:48 +0700 |
commit | dc8ee72eb6069c181621a3dc4ad97f8cced9db4b (patch) | |
tree | bc72f4453ce28e2900505127286bf2066f87f3e7 /lib | |
parent | 50a1267b7d028f18df39523fd90399f0751180a4 (diff) | |
download | Nim-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.nim | 30 |
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 |