[project @ 2002-08-29 11:29:40 by simonmar]
[ghc-base.git] / System / Time.hsc
index 32a677f..bc6bcf9 100644 (file)
@@ -199,6 +199,7 @@ noTimeDiff = TimeDiff 0 0 0 0 0 0 0
 -- -----------------------------------------------------------------------------
 -- getClockTime returns the current time in its internal representation.
 
+getClockTime :: IO ClockTime
 #if HAVE_GETTIMEOFDAY
 getClockTime = do
   allocaBytes (#const sizeof(struct timeval)) $ \ p_timeval -> do
@@ -335,8 +336,7 @@ foreign import ccall "&timezone" timezone :: Ptr CTime
 gmtoff x = do 
   dst <- (#peek struct tm,tm_isdst) x
   tz <- if dst then peek altzone else peek timezone
-  return (fromIntegral tz)
-#  define GMTOFF(x)     (((struct tm *)x)->tm_isdst ? altzone : timezone )
+  return (-fromIntegral tz)
 # else /* ! HAVE_ALTZONE */
 
 #if !defined(mingw32_TARGET_OS)
@@ -347,7 +347,13 @@ foreign import ccall unsafe "timezone" timezone :: Ptr CLong
 gmtoff x = do 
   dst <- (#peek struct tm,tm_isdst) x
   tz  <- peek timezone
-  if dst then return (fromIntegral tz - 3600) else return tz
+   -- According to the documentation for tzset(), 
+   --   http://www.opengroup.org/onlinepubs/007908799/xsh/tzset.html
+   -- timezone offsets are > 0 west of the Prime Meridian.
+   --
+   -- This module assumes the interpretation of tm_gmtoff, i.e., offsets
+   -- are > 0 East of the Prime Meridian, so flip the sign.
+  return (- (if dst then (fromIntegral tz - 3600) else tz))
 # endif /* ! HAVE_ALTZONE */
 #endif  /* ! HAVE_TM_ZONE */