-- to compile on sparc-solaris. Blargh.
-- -----------------------------------------------------------------------------
--- $Id: Time.hsc,v 1.8 2001/01/26 17:51:54 rrt Exp $
+-- $Id: Time.hsc,v 1.16 2001/07/13 11:48:52 rrt Exp $
--
-- (c) The University of Glasgow, 1995-2001
--
, Day(..)
, ClockTime(..) -- non-standard, lib. report gives this as abstract
+ -- instance Eq, Ord
+ -- instance Show (non-standard)
+
, getClockTime
, TimeDiff(..)
) where
-#include "config.h"
-
-#if defined(HAVE_GETTIMEOFDAY)
-# ifdef HAVE_SYS_TIME_H
-# include <sys/time.h>
-# endif
-#elif defined(HAVE_GETCLOCK)
-# ifdef HAVE_SYS_TIMERS_H
-# define POSIX_4D9 1
-# include <sys/timers.h>
-# endif
-#elif defined(HAVE_TIME_H)
-# include <time.h>
-#endif
-
-#ifdef HAVE_WINDOWS_H
-#include <windows.h>
-#include <sys/types.h>
-#include <sys/timeb.h>
-#endif
+#include "HsStd.h"
import Ix
import Locale
Integer -- Picoseconds with the specified second
deriving (Eq, Ord)
--- When a @ClockTime@ is shown, it is converted to a string of the form
--- @"Mon Nov 28 21:45:41 GMT 1994"@.
-
--- For now, we are restricted to roughly:
--- Fri Dec 13 20:45:52 1901 through Tue Jan 19 03:14:07 2038, because
--- we use the C library routines based on 32 bit integers.
+-- When a ClockTime is shown, it is converted to a CalendarTime in the current
+-- timezone and then printed. FIXME: This is arguably wrong, since we can't
+-- get the current timezone without being in the IO monad.
instance Show ClockTime where
- showsPrec _ (TOD secs _nsec) =
- showString $ unsafePerformIO $ do
- withObject (fromIntegral secs :: CTime) $ \ p_timer -> do
- p_tm <- localtime p_timer -- can't fail, according to POSIX
- allocaBytes 64 $ \ p_buf -> do -- big enough for error message
- r <- strftime p_buf 50 "%a %b %d %H:%M:%S %Z %Y"## p_tm
- if r == 0
- then return "ClockTime.show{Time}: internal error"
- else peekCString p_buf
-
+ showsPrec _ t = showString (calendarTimeToString
+ (unsafePerformIO (toCalendarTime t)))
showList = showList__ (showsPrec 0)
{-
addToClockTime (TimeDiff year mon day hour min sec psec)
(TOD c_sec c_psec) =
let
- sec_diff = fromInt sec + 60 * fromInt min + 3600 * fromInt hour + 24 * 3600 * fromInt day
+ sec_diff = toInteger sec +
+ 60 * toInteger min +
+ 3600 * toInteger hour +
+ 24 * 3600 * toInteger day
cal = toUTCTime (TOD (c_sec + sec_diff) (c_psec + psec))
-- FIXME! ^^^^
new_mon = fromEnum (ctMonth cal) + r_mon
gmtoff x = (#peek struct tm,tm_gmtoff) x
#else /* ! HAVE_TM_ZONE */
-# if HAVE_TZNAME || _WIN32
+# if HAVE_TZNAME || defined(_WIN32)
# if cygwin32_TARGET_OS
# define tzname _tzname
# endif
-- result.
--
gmtoff <- gmtoff p_tm
- let res = fromIntegral t + tz - fromIntegral gmtoff
+ let res = fromIntegral t - tz + fromIntegral gmtoff
return (TOD (fromIntegral res) 0)
-- -----------------------------------------------------------------------------
foreign import unsafe localtime :: Ptr CTime -> IO (Ptr CTm)
foreign import unsafe gmtime :: Ptr CTime -> IO (Ptr CTm)
-foreign import unsafe strftime :: Ptr CChar -> CSize -> Addr## -> Ptr CTm -> IO CSize
foreign import unsafe mktime :: Ptr CTm -> IO CTime
foreign import unsafe time :: Ptr CTime -> IO CTime