[commit: packages/time] master: getCurrentTimezone, with test (cb6d14e)
git at git.haskell.org
git at git.haskell.org
Fri Jan 23 22:52:59 UTC 2015
Repository : ssh://git@git.haskell.org/time
On branch : master
Link : http://git.haskell.org/packages/time.git/commitdiff/cb6d14eea0baae5259775481c8b7cc0b584b1219
>---------------------------------------------------------------
commit cb6d14eea0baae5259775481c8b7cc0b584b1219
Author: Ashley Yakeley <ashley at semantic.org>
Date: Sun Mar 20 22:37:22 2005 -0800
getCurrentTimezone, with test
darcs-hash:20050321063722-ac6dd-9792ff0e686b52fa1c9770058f77e6614445f6fb
>---------------------------------------------------------------
cb6d14eea0baae5259775481c8b7cc0b584b1219
CurrentTime.hs | 6 +++---
Makefile | 5 ++++-
System/Time/Calendar.hs | 16 +++++++++++++++-
timestuff.c | 11 +++++++++++
timestuff.h | 1 +
5 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/CurrentTime.hs b/CurrentTime.hs
index 19e46c1..770699d 100644
--- a/CurrentTime.hs
+++ b/CurrentTime.hs
@@ -4,11 +4,11 @@ import System.Time.Clock
import System.Time.TAI
import System.Time.Calendar
-myzone :: TimeZone
-myzone = hoursToTimezone (- 8)
-
main :: IO ()
main = do
now <- getCurrentTime
putStrLn (show (utctDay now) ++ "," ++ show (utctDayTime now))
+ putStrLn (show (utcToCalendar utc now))
+ myzone <- getCurrentTimezone
+ putStrLn ("timezone minutes: " ++ show (timezoneToMinutes myzone))
putStrLn (show (utcToCalendar myzone now))
diff --git a/Makefile b/Makefile
index 82f4d8a..e29aaa5 100644
--- a/Makefile
+++ b/Makefile
@@ -11,7 +11,10 @@ TestTime: TestTime.o libTimeLib.a
CurrentTime: CurrentTime.o libTimeLib.a
ghc $^ -o $@
-libTimeLib.a: $(patsubst %.hs,%.o,$(SRCS))
+timestuff.o: timestuff.c timestuff.h
+ gcc -o $@ -c $<
+
+libTimeLib.a: $(patsubst %.hs,%.o,$(SRCS)) timestuff.o
rm -f $@
ar cru $@ $^
ranlib $@
diff --git a/System/Time/Calendar.hs b/System/Time/Calendar.hs
index 5cc646a..683e017 100644
--- a/System/Time/Calendar.hs
+++ b/System/Time/Calendar.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS -Wall -Werror #-}
+{-# OPTIONS -ffi -Wall -Werror #-}
module System.Time.Calendar
(
@@ -6,6 +6,7 @@ module System.Time.Calendar
TimeZone,timezoneToMinutes,minutesToTimezone,hoursToTimezone,utc,
-- getting the locale time zone
+ getCurrentTimezone,
-- Gregorian "calendrical" format
TimeOfDay(..),CalendarDay(..),CalendarTime(..),
@@ -29,6 +30,9 @@ import System.Time.Clock
import Data.Fixed
import Data.Char
+import Foreign
+import Foreign.C
+
-- | count of minutes
newtype TimeZone = MkTimeZone {
timezoneToMinutes :: Int
@@ -44,6 +48,16 @@ hoursToTimezone i = minutesToTimezone (60 * i)
utc :: TimeZone
utc = minutesToTimezone 0
+foreign import ccall unsafe "timestuff.h get_current_timezone_seconds" get_current_timezone_seconds :: IO CLong
+
+-- | Get the current time-zone
+getCurrentTimezone :: IO TimeZone
+getCurrentTimezone = do
+ secs <- get_current_timezone_seconds
+ case secs of
+ 0x80000000 -> fail "localtime_r failed"
+ _ -> return (minutesToTimezone (div (fromIntegral secs) 60))
+
-- | time of day as represented in hour, minute and second (with picoseconds), typically used to express local time of day
data TimeOfDay = TimeOfDay {
todHour :: Int,
diff --git a/timestuff.c b/timestuff.c
new file mode 100644
index 0000000..79139bd
--- /dev/null
+++ b/timestuff.c
@@ -0,0 +1,11 @@
+#include <sys/time.h>
+
+long int get_current_timezone_seconds ()
+{
+ time_t t = 0;
+ struct tm tmd;
+ struct tm* ptm = localtime_r(&t,&tmd);
+ if (ptm)
+ return ptm -> tm_gmtoff;
+ else return 0x80000000;
+}
diff --git a/timestuff.h b/timestuff.h
new file mode 100644
index 0000000..f58c0f1
--- /dev/null
+++ b/timestuff.h
@@ -0,0 +1 @@
+long int get_current_timezone_seconds ();
More information about the ghc-commits
mailing list