System.Time で今日の日付を取得

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 --=> 東京 (標準時)