diff --git a/Data/UnixTime/Conv.hs b/Data/UnixTime/Conv.hs
--- a/Data/UnixTime/Conv.hs
+++ b/Data/UnixTime/Conv.hs
@@ -8,6 +8,7 @@
   , fromClockTime, toClockTime
   ) where
 
+import Control.Applicative
 import Data.ByteString
 import Data.ByteString.Unsafe
 import Data.UnixTime.Types
@@ -25,10 +26,10 @@
         c_parse_unix_time_gmt :: CString -> CString -> IO CTime
 
 foreign import ccall unsafe "c_format_unix_time"
-        c_format_unix_time :: CString -> CTime -> CString -> CInt -> IO ()
+        c_format_unix_time :: CString -> CTime -> CString -> CInt -> IO CSize
 
 foreign import ccall unsafe "c_format_unix_time_gmt"
-        c_format_unix_time_gmt :: CString -> CTime -> CString -> CInt -> IO ()
+        c_format_unix_time_gmt :: CString -> CTime -> CString -> CInt -> IO CSize
 
 ----------------------------------------------------------------
 
@@ -64,13 +65,10 @@
 -- Formatting 'UnixTime' to 'ByteString' in local time.
 -- This is a wrapper for strftime_l().
 
-formatUnixTime :: Format -> UnixTime -> ByteString
-formatUnixTime fmt (UnixTime sec _) = unsafePerformIO $
-    useAsCString fmt $ \cfmt -> do
-        let siz = 256 -- FIXME
-        ptr <- mallocBytes siz
-        c_format_unix_time cfmt sec ptr (fromIntegral siz)
-        unsafePackMallocCString ptr
+formatUnixTime :: Format -> UnixTime -> IO ByteString
+formatUnixTime fmt t =
+    formatUnixTimeHelper c_format_unix_time fmt t
+{-# INLINE formatUnixTime #-}
 
 -- |
 -- Formatting 'UnixTime' to 'ByteString' in GMT.
@@ -80,12 +78,25 @@
 -- "Thu, 01 Jan 1970 00:00:00 GMT"
 
 formatUnixTimeGMT :: Format -> UnixTime -> ByteString
-formatUnixTimeGMT fmt (UnixTime sec _) = unsafePerformIO $
+formatUnixTimeGMT fmt t =
+    unsafePerformIO $ formatUnixTimeHelper c_format_unix_time_gmt fmt t
+{-# INLINE formatUnixTimeGMT #-}
+
+-- |
+-- Helper handling memory allocation for formatUnixTime and formatUnixTimeGMT.
+
+formatUnixTimeHelper
+    :: (CString -> CTime -> CString -> CInt -> IO CSize)
+    -> Format
+    -> UnixTime
+    -> IO ByteString
+formatUnixTimeHelper formatFun fmt (UnixTime sec _) =
     useAsCString fmt $ \cfmt -> do
-        let siz = 256 -- FIXME
-        ptr <- mallocBytes siz
-        c_format_unix_time_gmt cfmt sec ptr (fromIntegral siz)
-        unsafePackMallocCString ptr
+        let siz = 80
+        ptr  <- mallocBytes siz
+        len  <- fromIntegral <$> formatFun cfmt sec ptr (fromIntegral siz)
+        ptr' <- reallocBytes ptr (len + 1)
+        unsafePackMallocCString ptr' -- FIXME: Use unsafePackMallocCStringLen from bytestring-0.10.2.0
 
 ----------------------------------------------------------------
 
diff --git a/cbits/conv.c b/cbits/conv.c
--- a/cbits/conv.c
+++ b/cbits/conv.c
@@ -58,24 +58,24 @@
     return timegm(&dst);
 }
 
-void c_format_unix_time(char *fmt, time_t src, char* dst, int siz) {
+size_t c_format_unix_time(char *fmt, time_t src, char* dst, int siz) {
     struct tm tim;
     init_locale();
     localtime_r(&src, &tim);
 #if THREAD_SAFE
-    strftime_l(dst, siz, fmt, &tim, c_locale);
+    return strftime_l(dst, siz, fmt, &tim, c_locale);
 #else
-    strftime(dst, siz, fmt, &tim);
+    return strftime(dst, siz, fmt, &tim);
 #endif
 }
 
-void c_format_unix_time_gmt(char *fmt, time_t src, char* dst, int siz) {
+size_t c_format_unix_time_gmt(char *fmt, time_t src, char* dst, int siz) {
     struct tm tim;
     init_locale();
     gmtime_r(&src, &tim);
 #if THREAD_SAFE
-    strftime_l(dst, siz, fmt, &tim, c_locale);
+    return strftime_l(dst, siz, fmt, &tim, c_locale);
 #else
-    strftime(dst, siz, fmt, &tim);
+    return strftime(dst, siz, fmt, &tim);
 #endif
 }
diff --git a/test/UnixTimeSpec.hs b/test/UnixTimeSpec.hs
--- a/test/UnixTimeSpec.hs
+++ b/test/UnixTimeSpec.hs
@@ -34,7 +34,7 @@
                 utcTime = toUTCTime ut
             timeZone <- getTimeZone utcTime
             let model = formatMailModel utcTime timeZone
-            ours `shouldBe` model
+            ours `shouldReturn` model
 
     describe "parseUnixTimeGMT & formatUnixTimeGMT" $
         prop "inverses the result" $ \ut@(UnixTime sec _) ->
diff --git a/unix-time.cabal b/unix-time.cabal
--- a/unix-time.cabal
+++ b/unix-time.cabal
@@ -1,5 +1,5 @@
 Name:                   unix-time
-Version:                0.1.9
+Version:                0.1.10
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
