diff --git a/hakyll.cabal b/hakyll.cabal
--- a/hakyll.cabal
+++ b/hakyll.cabal
@@ -1,5 +1,5 @@
 Name:    hakyll
-Version: 3.2.5.1
+Version: 3.2.6.0
 
 Synopsis: A static website compiler library
 Description:
@@ -60,25 +60,25 @@
 
   Build-Depends:
     base        >= 4      && < 5,
-    binary      >= 0.5    && < 1.0,
+    binary      >= 0.5    && < 0.6,
     blaze-html  >= 0.4    && < 0.6,
-    bytestring  >= 0.9    && < 1.0,
+    bytestring  >= 0.9    && < 0.10,
     citeproc-hs >= 0.3.2  && < 0.4,
-    containers  >= 0.3    && < 1.0,
+    containers  >= 0.3    && < 0.5,
     cryptohash  >= 0.7    && < 0.8,
-    directory   >= 1.0    && < 1.3,
-    filepath    >= 1.0    && < 2.0,
+    directory   >= 1.0    && < 1.2,
+    filepath    >= 1.0    && < 1.4,
     hamlet      >= 0.10.3 && < 0.11,
-    mtl         >= 1      && < 3.0,
-    old-locale  >= 1.0    && < 2.0,
-    old-time    >= 1.0    && < 1.3,
-    pandoc      >= 1.6    && < 2.0,
+    mtl         >= 1      && < 2.1,
+    old-locale  >= 1.0    && < 1.1,
+    old-time    >= 1.0    && < 1.2,
+    pandoc      >= 1.9    && < 1.10,
     parsec      >= 3.0    && < 3.2,
-    process     >= 1.0    && < 1.4,
-    regex-base  >= 0.93   && < 1.0,
-    regex-pcre  >= 0.93   && < 1.0,
+    process     >= 1.0    && < 1.2,
+    regex-base  >= 0.93   && < 0.94,
+    regex-pcre  >= 0.93   && < 0.95,
     tagsoup     >= 0.12.6 && < 0.13,
-    time        >= 1.1    && < 1.3,
+    time        >= 1.1    && < 1.5,
     unix        >= 2.4    && < 2.6
 
   Exposed-Modules:
diff --git a/src/Hakyll/Web/Page/Metadata.hs b/src/Hakyll/Web/Page/Metadata.hs
--- a/src/Hakyll/Web/Page/Metadata.hs
+++ b/src/Hakyll/Web/Page/Metadata.hs
@@ -16,19 +16,24 @@
     , renderModificationTimeWith
     , copyBodyToField
     , copyBodyFromField
+    , comparePagesByDate
     ) where
 
-import Prelude hiding (id)
-import Control.Category (id)
 import Control.Arrow (Arrow, arr, (>>>), (***), (&&&))
+import Control.Category (id)
+import Control.Monad (msum)
 import Data.List (intercalate)
 import Data.Maybe (fromMaybe)
-import Data.Time.Clock (UTCTime)
-import Data.Time.Format (parseTime, formatTime)
-import qualified Data.Map as M
+import Data.Ord (comparing)
+import Prelude hiding (id)
 import System.FilePath (takeFileName)
 import System.Locale (TimeLocale, defaultTimeLocale)
+import qualified Data.Map as M
 
+import Data.Time.Calendar (Day (..))
+import Data.Time.Clock (UTCTime (..))
+import Data.Time.Format (parseTime, formatTime)
+
 import Hakyll.Web.Page.Internal
 import Hakyll.Core.Util.String
 import Hakyll.Core.Identifier
@@ -118,12 +123,24 @@
           -> Page a  -- ^ Resulting page
 copyField src dst = renderField src dst id
 
--- | When the metadata has a field called @path@ in a
--- @folder/yyyy-mm-dd-title.extension@ format (the convention for pages),
--- this function can render the date.
+-- | When the metadata has a field called @published@ in one of the
+-- following formats then this function can render the date.
 --
--- > renderDate "date" "%B %e, %Y" "Date unknown"
+--   * @Sun, 01 Feb 2000 13:00:00 UT@ (RSS date format)
 --
+--   * @2000-02-01T13:00:00Z@ (Atom date format)
+--
+--   * @February 1, 2000 1:00 PM@ (PM is usually uppercase)
+--
+--   * @February 1, 2000@ (assumes 12:00 AM for the time)
+--
+-- Alternatively, when the metadata has a field called @path@ in a
+-- @folder/yyyy-mm-dd-title.extension@ format (the convention for pages)
+-- and no @published@ metadata field set, this function can render
+-- the date.
+--
+-- > renderDateField "date" "%B %e, %Y" "Date unknown"
+--
 -- Will render something like @January 32, 2010@.
 --
 renderDateField :: String  -- ^ Key in which the rendered date should be placed
@@ -143,19 +160,31 @@
                     -> String      -- ^ Default value
                     -> Page a      -- ^ Target page
                     -> Page a      -- ^ Resulting page
-renderDateFieldWith locale key format defaultValue =
-    renderField "path" key renderDate'
+renderDateFieldWith locale key format defaultValue page =
+    setField key renderTimeString page
   where
-    renderDate' filePath = fromMaybe defaultValue $ do
-        let dateString = intercalate "-" $ take 3
-                       $ splitAll "-" $ takeFileName filePath
-        time <- parseTime defaultTimeLocale
-                          "%Y-%m-%d"
-                          dateString :: Maybe UTCTime
+    renderTimeString = fromMaybe defaultValue $ do
+        time <- getUTCMaybe locale page
         return $ formatTime locale format time
 
+-- | Parser to try to extract and parse the time from the @published@
+-- field or from the filename. See 'renderDateField' for more information.
+getUTCMaybe :: TimeLocale     -- ^ Output time locale
+            -> Page a         -- ^ Input page
+            -> Maybe UTCTime  -- ^ Parsed UTCTime
+getUTCMaybe locale page = msum
+    [ fromPublished "%a, %d %b %Y %H:%M:%S UT"
+    , fromPublished "%Y-%m-%dT%H:%M:%SZ"
+    , fromPublished "%B %e, %Y %l:%M %p"
+    , fromPublished "%B %e, %Y"
+    , getFieldMaybe "path" page >>= parseTime' "%Y-%m-%d" .
+        intercalate "-" . take 3 . splitAll "-" . takeFileName
+    ]
+  where
+    fromPublished f  = getFieldMaybe "published" page >>= parseTime' f
+    parseTime' f str = parseTime locale f str
+
 -- | Set the modification time as a field in the page
---
 renderModificationTime :: String
                        -- ^ Destination key
                        -> String
@@ -189,3 +218,11 @@
                   -> Page String  -- ^ Target page
                   -> Page String  -- ^ Resulting page
 copyBodyFromField key page = fmap (const $ getField key page) page
+
+-- | Compare pages by the date and time parsed as in 'renderDateField',
+-- where 'LT' implies earlier, and 'GT' implies later. For more details,
+-- see 'renderDateField'.
+comparePagesByDate :: Page a -> Page a -> Ordering
+comparePagesByDate = comparing $ fromMaybe zero . getUTCMaybe defaultTimeLocale
+  where
+    zero = UTCTime (ModifiedJulianDay 0) 0
diff --git a/src/Hakyll/Web/Pandoc/Biblio.hs b/src/Hakyll/Web/Pandoc/Biblio.hs
--- a/src/Hakyll/Web/Pandoc/Biblio.hs
+++ b/src/Hakyll/Web/Pandoc/Biblio.hs
@@ -67,7 +67,7 @@
         state' = state {stateCitations = stateCitations state ++ cits}
     pandocPage <- pageReadPandocWithA -< (state', page)
     let pandoc = pageBody pandocPage
-    pandoc' <- unsafeCompiler (tuc processBiblio) -< (csl', refs', pandoc)
+    pandoc' <- unsafeCompiler processBiblio' -< (csl', refs', pandoc)
     returnA -< pandocPage {pageBody = pandoc'}
   where
-    tuc f (x, y, z) = f x y z
+    processBiblio' (c, r, p) = processBiblio c Nothing r p
