diff --git a/System/Log/FastLogger.hs b/System/Log/FastLogger.hs
--- a/System/Log/FastLogger.hs
+++ b/System/Log/FastLogger.hs
@@ -1,5 +1,6 @@
 {-# LANGUAGE NoImplicitPrelude, RecordWildCards #-}
 {-# LANGUAGE FlexibleInstances, BangPatterns #-}
+{-# LANGUAGE OverloadedStrings #-}
 
 -- | Fast logging system to copy log data directly to Handle buffer.
 
@@ -7,6 +8,7 @@
   -- * Logger
     Logger
   , mkLogger
+  , mkLogger2
   , renewLogger
   , rmLogger
   -- * Logging
@@ -16,15 +18,15 @@
   -- * Strings
   , LogStr(..)
   , ToLogStr(..)
-  -- * Misc functions
+  -- * Date
   , loggerDate
+  , module System.Log.FastLogger.Date
   -- * File rotation
   , module System.Log.FastLogger.File
   ) where
 
 import Blaze.ByteString.Builder
 import Blaze.ByteString.Builder.Char8 (fromString)
-import Control.Applicative
 import Control.Monad
 import qualified Data.ByteString as BS
 import Data.ByteString.Internal (ByteString(..), c2w)
@@ -44,6 +46,7 @@
 import GHC.IORef
 import GHC.Num
 import GHC.Real
+import System.Date.Cache
 import System.IO
 import System.Log.FastLogger.Date
 import System.Log.FastLogger.File
@@ -56,9 +59,10 @@
 
 -- | Abstract data type for logger.
 data Logger = Logger {
-    loggerAutoFlush :: Bool
-  , loggerHandle    :: Handle
-  , loggerDateRef   :: DateRef
+    loggerAutoFlush  :: Bool
+  , loggerHandle     :: Handle
+  , loggerDateGetter :: DateCacheGetter
+  , loggerDateCloser :: DateCacheCloser
   }
 
 logBufSize :: Int
@@ -68,12 +72,21 @@
 initHandle hdl = hSetBuffering hdl (BlockBuffering (Just logBufSize))
 
 -- | Creates a 'Logger' from the given handle.
+-- ('ondemandDateCacher' 'zonedDateCacheConf') is used as a Date getter.
 mkLogger :: Bool -- ^ Automatically flush on each loggerPut?
          -> Handle -- ^ If 'Handle' is associated with a file, 'AppendMode' must be used.
          -> IO Logger
-mkLogger autoFlush hdl = do
+mkLogger autoFlush hdl =
+    ondemandDateCacher zonedDateCacheConf >>= mkLogger2 autoFlush hdl
+
+-- | Creates a 'Logger' from the given handle.
+mkLogger2 :: Bool -- ^ Automatically flush on each loggerPut?
+          -> Handle -- ^ If 'Handle' is associated with a file, 'AppendMode' must be used.
+          -> (DateCacheGetter, DateCacheCloser) -- ^ Date getter/closer. E.g. ('clockDateCacher' 'zonedDateCacheConf')           
+          -> IO Logger
+mkLogger2 autoFlush hdl (getter,closer) = do
     initHandle hdl
-    Logger autoFlush hdl <$> dateInit
+    return $ Logger autoFlush hdl getter closer
 
 -- | Creates a new 'Logger' from old one by replacing 'Handle'.
 -- The new 'Handle' automatically inherits the file mode of
@@ -89,7 +102,7 @@
 
 -- | Destroy a 'Logger' by closing internal 'Handle'.
 rmLogger :: Logger -> IO ()
-rmLogger (Logger _ hdl _) = hClose hdl
+rmLogger lgr = hClose (loggerHandle lgr) >> loggerDateCloser lgr
 
 -- | A date type to contain 'String' and 'ByteString'.
 -- This data is exported so that format can be defined.
@@ -191,4 +204,4 @@
 
 -- | Obtaining date string from 'Logger'.
 loggerDate :: Logger -> IO ZonedDate
-loggerDate logger = getDate $ loggerDateRef logger
+loggerDate logger = loggerDateGetter logger
diff --git a/System/Log/FastLogger/Date.hs b/System/Log/FastLogger/Date.hs
--- a/System/Log/FastLogger/Date.hs
+++ b/System/Log/FastLogger/Date.hs
@@ -2,63 +2,35 @@
 
 module System.Log.FastLogger.Date (
     ZonedDate
-  , DateRef
-  , dateInit
-  , getDate
+  , zonedDateCacheConf
   ) where
 
-import Control.Applicative
-import Data.ByteString (ByteString)
-import Data.IORef
+import Data.ByteString
+import System.Date.Cache
 #if WINDOWS
 import qualified Data.ByteString.Char8 as BS
 import Data.Time
 import System.Locale
-#define TIME UTCTime
-#define GETTIME getCurrentTime
 #else
 import Data.UnixTime
 import System.Posix (EpochTime, epochTime)
-#define TIME EpochTime
-#define GETTIME epochTime
 #endif
 
 -- | A type for zoned date.
 type ZonedDate = ByteString
 
-data DateCache = DateCache {
-    timeKey  :: !TIME
-  , zonedDate :: !ZonedDate
-  } deriving (Eq, Show)
-
--- | Reference to the 'ZonedDate' cache.
-newtype DateRef = DateRef (IORef DateCache)
-
--- | Getting 'ZonedDate' from the 'ZonedDate' cache.
-getDate :: DateRef -> IO ZonedDate
-getDate (DateRef ref) = do
-    newEt <- GETTIME
-    cache <- readIORef ref
-    let oldEt = timeKey cache
-    if oldEt == newEt then
-        return $ zonedDate cache
-      else do
-        newCache <- newDate newEt
-        writeIORef ref newCache
-        return $ zonedDate newCache
-
-newDate :: TIME -> IO DateCache
 #if WINDOWS
-newDate et = DateCache et . format <$> toZonedTime et
-  where
-    format = BS.pack . formatTime defaultTimeLocale "%d/%b/%Y:%T %z"
-    toZonedTime = utcToLocalZonedTime
+zonedDateCacheConf :: DateCacheConf UTCTime
+zonedDateCacheConf = DateCacheConf {
+    getTime = getCurrentTime
+  , formatDate ut = do
+      zt <- utcToLocalZonedTime ut
+      return $ BS.pack $ formatTime defaultTimeLocale "%d/%b/%Y:%T %z" zt
+  }
 #else
-newDate et = return $ DateCache et $ toZonedTime et
-  where
-    toZonedTime = formatUnixTime "%d/%b/%Y:%T %z" . fromEpochTime
+zonedDateCacheConf :: DateCacheConf EpochTime
+zonedDateCacheConf = DateCacheConf {
+    getTime = epochTime
+  , formatDate = return . formatUnixTime "%d/%b/%Y:%T %z" . fromEpochTime
+  }
 #endif
-
--- | Initializing the 'ZonedDate' cache.
-dateInit :: IO DateRef
-dateInit = DateRef <$> (GETTIME >>= newDate >>= newIORef)
diff --git a/fast-logger.cabal b/fast-logger.cabal
--- a/fast-logger.cabal
+++ b/fast-logger.cabal
@@ -1,5 +1,5 @@
 Name:                   fast-logger
-Version:                0.2.2
+Version:                0.3.0
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
@@ -18,6 +18,7 @@
   Build-Depends:        base >= 4 && < 5
                       , blaze-builder
                       , bytestring
+                      , date-cache >= 0.3
                       , directory
                       , filepath
                       , text
@@ -36,8 +37,6 @@
 
     Ghc-Options:     -Wall
     Build-Depends:   base >= 4 && < 5
-                   , HUnit
-                   , QuickCheck
                    , bytestring
                    , fast-logger
                    , hspec
