Data.DateTime の toGregorian' :: DateTime -> (Integer, Int, Int) での日付管理は便利なのですが、UTC の日付です。System.Time で取得した時間でも DateTime に変換した時点で UTC になってしまいます。
-- DateTime > getCurrentTime --=> 2010-11-27 03:31:19.815121 UTC -- System.Time で > getClockTime --=> Sat Nov 27 12:31:24 東京 (標準時) 2010 > c <- getClockTime > fromClockTime c --=> 2010-11-27 03:31:38 UTC
そこで System.Time の CalendarTime から Data.DateTime の toGregorian'相当の gregorianDate を作ります。
import System.Time (CalendarTime(..), Month(..), getClockTime, toCalendarTime) today :: IO (Integer, Int, Int) today = do now <- calendarNow return $ gregorianDate now gregorianDate :: CalendarTime -> (Integer, Int, Int) gregorianDate cal = (fromIntegral $ ctYear cal, toNumber $ ctMonth cal, ctDay cal) calendarNow :: IO CalendarTime calendarNow = toCalendarTime =<< getClockTime toNumber :: Month -> Int toNumber January = 1 toNumber February = 2 toNumber March = 3 toNumber April = 4 toNumber May = 5 toNumber June = 6 toNumber July = 7 toNumber August = 8 toNumber September = 9 toNumber October = 10 toNumber November = 11 toNumber December = 12
> today --=> (2010,11,27) > calendarNow CalendarTime {ctYear = 2010, ctMonth = November, ctDay = 27, ctHour = 12, ctMin = 18, ctSec = 32, ctPicosec = 505833000000, ctWDay = Saturday, ctYDay = 330, ctTZName = "\147\140\139\158 (\149W\143\128\142\158)", ctTZ = 32400, ctIsDST = False} > cal <- calendarNow > putStrLn $ ctTZName cal --=> 東京 (標準時)