diff --git a/formatting.cabal b/formatting.cabal
--- a/formatting.cabal
+++ b/formatting.cabal
@@ -1,5 +1,5 @@
 name:                formatting
-version:             6.0.0
+version:             6.1.0
 synopsis:            Combinator-based type-safe formatting (like printf() or FORMAT)
 description:         Combinator-based type-safe formatting (like printf() or FORMAT), modelled from the HoleyMonoids package.
 license:             BSD3
@@ -19,13 +19,15 @@
                      Formatting.ShortFormatters,
                      Formatting.Examples,
                      Formatting.Time,
+                     Formatting.Clock,
                      Formatting.Internal
   build-depends:     base >= 4 && < 5,
                      text-format,
                      text >= 0.11.0.8,
                      time,
                      old-locale,
-                     scientific >= 0.3.0.0
+                     scientific >= 0.3.0.0,
+                     clock >= 0.4
   hs-source-dirs:    src
   ghc-options:       -O2
 
diff --git a/src/Formatting/Clock.hs b/src/Formatting/Clock.hs
new file mode 100644
--- /dev/null
+++ b/src/Formatting/Clock.hs
@@ -0,0 +1,39 @@
+{-# LANGUAGE PatternGuards #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# OPTIONS_GHC -fno-warn-type-defaults #-}
+
+-- | Formatters for high-res, real-time and timer clock values from "System.Clock".
+
+module Formatting.Clock where
+
+import Formatting
+import System.Clock
+
+-- | Format the duration from start to end (args passed in that order).
+--
+-- Examples:
+--
+-- @
+-- 4.00 s
+-- 500.69 ms
+-- 1.20 ms
+-- 19.38 µs
+-- @
+timeSpecs :: Format r (TimeSpec -> TimeSpec -> r)
+timeSpecs = Holey (\g x y -> g (fmt x y))
+  where fmt (TimeSpec s1 n1) (TimeSpec s2 n2)
+          | Just i <- scale ((10 ^ 9) * 60 * 60 * 24) = bprint (fixed 2 % " d") i
+          | Just i <- scale ((10 ^ 9) * 60 * 60) = bprint (fixed 2 % " h") i
+          | Just i <- scale ((10 ^ 9) * 60) = bprint (fixed 2 % " m") i
+          | Just i <- scale (10 ^ 9) = bprint (fixed 2 % " s") i
+          | Just i <- scale (10 ^ 6) = bprint (fixed 2 % " ms") i
+          | Just i <- scale (10 ^ 3) = bprint (fixed 2 % " µs") i
+          | otherwise = bprint (int % " ns") diff
+          where scale :: Integer -> Maybe Double
+                scale i = if diff >= i
+                             then Just (fromIntegral diff / fromIntegral i)
+                             else Nothing
+                diff :: Integer
+                diff = a2 - a1
+                a1 = (fromIntegral s1 * 10 ^ 9) + fromIntegral n1
+                a2 = (fromIntegral s2 * 10 ^ 9) + fromIntegral n2
