diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,24 @@
 
 # Releases
 
+## Hakyll 4.12.5.0 (2019-01-12)
+
+- Update dependencies (contribution by Hexirp):
+    * Bump containers to 0.6
+    * Bump yaml to 0.11
+    * Bump pandoc to 2.5
+    * Bump pandoc-citeproc to 0.15
+    * Bump tasty to 1.2
+- Correct assertion in unixFilterError test
+  (contribution by Jim McStanton)
+- Add renderRssWithTemplates, renderAtomWithTemplates
+  (contribution by Abhinav Sarkar)
+- Speed up hashing in cache (contribution by 0xd34df00d)
+- Update type of fromFilePath to use FilePath instead of String
+  (contribution by Jim McStanton)
+- Drop extension when parsing dates in filepaths (contribution by
+  Gabriel Aumala)
+
 ## Hakyll 4.12.4.0 (2018-08-13)
 
 - Bump yaml to 0.10
diff --git a/hakyll.cabal b/hakyll.cabal
--- a/hakyll.cabal
+++ b/hakyll.cabal
@@ -1,5 +1,5 @@
 Name:    hakyll
-Version: 4.12.4.0
+Version: 4.12.5.0
 
 Synopsis: A static website compiler library
 Description:
@@ -166,7 +166,7 @@
     blaze-html           >= 0.5      && < 0.10,
     blaze-markup         >= 0.5.1    && < 0.9,
     bytestring           >= 0.9      && < 0.11,
-    containers           >= 0.3      && < 0.6,
+    containers           >= 0.3      && < 0.7,
     cryptohash           >= 0.7      && < 0.12,
     data-default         >= 0.4      && < 0.8,
     deepseq              >= 1.3      && < 1.5,
@@ -187,7 +187,7 @@
     time-locale-compat   >= 0.1      && < 0.2,
     unordered-containers >= 0.2      && < 0.3,
     vector               >= 0.11     && < 0.13,
-    yaml                 >= 0.8.11   && < 0.11,
+    yaml                 >= 0.8.11   && < 0.12,
     optparse-applicative >= 0.12     && < 0.15,
     file-embed           >= 0.0.10.1 && < 0.0.12
 
@@ -227,8 +227,8 @@
     Other-Modules:
       Hakyll.Web.Pandoc.Binary
     Build-Depends:
-      pandoc          >= 2.0.5    && < 2.3,
-      pandoc-citeproc >= 0.14     && < 0.15
+      pandoc          >= 2.0.5    && < 2.6,
+      pandoc-citeproc >= 0.14     && < 0.16
     Cpp-options:
       -DUSE_PANDOC
 
@@ -260,17 +260,17 @@
   Build-Depends:
     hakyll,
     QuickCheck                 >= 2.8  && < 2.13,
-    tasty                      >= 0.11 && < 1.2,
+    tasty                      >= 0.11 && < 1.3,
     tasty-hunit                >= 0.9  && < 0.11,
     tasty-quickcheck           >= 0.8  && < 0.11,
     -- Copy pasted from hakyll dependencies:
     base                 >= 4.8      && < 5,
     bytestring           >= 0.9      && < 0.11,
-    containers           >= 0.3      && < 0.6,
+    containers           >= 0.3      && < 0.7,
     filepath             >= 1.0      && < 1.5,
     text                 >= 0.11     && < 1.3,
     unordered-containers >= 0.2      && < 0.3,
-    yaml                 >= 0.8.11   && < 0.11
+    yaml                 >= 0.8.11   && < 0.12
 
   If flag(previewServer)
     Cpp-options:
@@ -321,4 +321,4 @@
     base      >= 4     && < 5,
     directory >= 1.0   && < 1.4,
     filepath  >= 1.0   && < 1.5,
-    pandoc    >= 2.0.5 && < 2.3
+    pandoc    >= 2.0.5 && < 2.6
diff --git a/lib/Hakyll/Core/Identifier.hs b/lib/Hakyll/Core/Identifier.hs
--- a/lib/Hakyll/Core/Identifier.hs
+++ b/lib/Hakyll/Core/Identifier.hs
@@ -62,7 +62,7 @@
 
 --------------------------------------------------------------------------------
 -- | Parse an identifier from a string
-fromFilePath :: String -> Identifier
+fromFilePath :: FilePath -> Identifier
 fromFilePath = Identifier Nothing .
     intercalate "/" . filter (not . null) . split'
   where
diff --git a/lib/Hakyll/Core/Store.hs b/lib/Hakyll/Core/Store.hs
--- a/lib/Hakyll/Core/Store.hs
+++ b/lib/Hakyll/Core/Store.hs
@@ -27,11 +27,11 @@
 import qualified Data.Text            as T
 import qualified Data.Text.Encoding   as T
 import           Data.Typeable        (TypeRep, Typeable, cast, typeOf)
+import           Numeric              (showHex)
 import           System.Directory     (createDirectoryIfMissing)
 import           System.Directory     (doesFileExist, removeFile)
 import           System.FilePath      ((</>))
 import           System.IO            (IOMode (..), hClose, openFile)
-import           Text.Printf          (printf)
 
 
 --------------------------------------------------------------------------------
@@ -193,5 +193,8 @@
 --------------------------------------------------------------------------------
 -- | Mostly meant for internal usage
 hash :: [String] -> String
-hash = concatMap (printf "%02x") . B.unpack .
-    MD5.hash . T.encodeUtf8 . T.pack . intercalate "/"
+hash = toHex . B.unpack . MD5.hash . T.encodeUtf8 . T.pack . intercalate "/"
+  where
+    toHex [] = ""
+    toHex (x : xs) | x < 16 = '0' : showHex x (toHex xs)
+                   | otherwise = showHex x (toHex xs)
diff --git a/lib/Hakyll/Web/Feed.hs b/lib/Hakyll/Web/Feed.hs
--- a/lib/Hakyll/Web/Feed.hs
+++ b/lib/Hakyll/Web/Feed.hs
@@ -22,6 +22,8 @@
     ( FeedConfiguration (..)
     , renderRss
     , renderAtom
+    , renderRssWithTemplates
+    , renderAtomWithTemplates
     ) where
 
 
@@ -126,14 +128,40 @@
 
 
 --------------------------------------------------------------------------------
+-- | Render an RSS feed using given templates with a number of items.
+renderRssWithTemplates ::
+       String                  -- ^ Feed template
+    -> String                  -- ^ Item template
+    -> FeedConfiguration       -- ^ Feed configuration
+    -> Context String          -- ^ Item context
+    -> [Item String]           -- ^ Feed items
+    -> Compiler (Item String)  -- ^ Resulting feed
+renderRssWithTemplates feedTemplate itemTemplate config context = renderFeed
+    feedTemplate itemTemplate config
+    (makeItemContext "%a, %d %b %Y %H:%M:%S UT" context)
+
+
+--------------------------------------------------------------------------------
+-- | Render an Atom feed using given templates with a number of items.
+renderAtomWithTemplates ::
+       String                  -- ^ Feed template
+    -> String                  -- ^ Item template
+    -> FeedConfiguration       -- ^ Feed configuration
+    -> Context String          -- ^ Item context
+    -> [Item String]           -- ^ Feed items
+    -> Compiler (Item String)  -- ^ Resulting feed
+renderAtomWithTemplates feedTemplate itemTemplate config context = renderFeed
+    feedTemplate itemTemplate config
+    (makeItemContext "%Y-%m-%dT%H:%M:%SZ" context)
+
+
+--------------------------------------------------------------------------------
 -- | Render an RSS feed with a number of items.
 renderRss :: FeedConfiguration       -- ^ Feed configuration
           -> Context String          -- ^ Item context
           -> [Item String]           -- ^ Feed items
           -> Compiler (Item String)  -- ^ Resulting feed
-renderRss config context = renderFeed
-    rssTemplate rssItemTemplate config
-    (makeItemContext "%a, %d %b %Y %H:%M:%S UT" context)
+renderRss = renderRssWithTemplates rssTemplate rssItemTemplate
 
 
 --------------------------------------------------------------------------------
@@ -142,9 +170,7 @@
            -> Context String          -- ^ Item context
            -> [Item String]           -- ^ Feed items
            -> Compiler (Item String)  -- ^ Resulting feed
-renderAtom config context = renderFeed
-    atomTemplate atomItemTemplate config
-    (makeItemContext "%Y-%m-%dT%H:%M:%SZ" context)
+renderAtom = renderAtomWithTemplates atomTemplate atomItemTemplate
 
 
 --------------------------------------------------------------------------------
diff --git a/lib/Hakyll/Web/Template/Context.hs b/lib/Hakyll/Web/Template/Context.hs
--- a/lib/Hakyll/Web/Template/Context.hs
+++ b/lib/Hakyll/Web/Template/Context.hs
@@ -50,7 +50,7 @@
 import           Hakyll.Core.Provider
 import           Hakyll.Core.Util.String       (needlePrefix, splitAll)
 import           Hakyll.Web.Html
-import           System.FilePath               (splitDirectories, takeBaseName)
+import           System.FilePath               (splitDirectories, takeBaseName, dropExtension)
 
 
 --------------------------------------------------------------------------------
@@ -300,7 +300,7 @@
 getItemUTC locale id' = do
     metadata <- getMetadata id'
     let tryField k fmt = lookupString k metadata >>= parseTime' fmt
-        paths          = splitDirectories $ toFilePath id'
+        paths          = splitDirectories $ (dropExtension . toFilePath) id'
 
     maybe empty' return $ msum $
         [tryField "published" fmt | fmt <- formats] ++
diff --git a/tests/Hakyll/Core/UnixFilter/Tests.hs b/tests/Hakyll/Core/UnixFilter/Tests.hs
--- a/tests/Hakyll/Core/UnixFilter/Tests.hs
+++ b/tests/Hakyll/Core/UnixFilter/Tests.hs
@@ -67,8 +67,10 @@
     provider <- newTestProvider store
     result   <- testCompiler store provider testMarkdown compiler
     case result of
-        CompilerError es -> True H.@=? any ("invalid option" `isInfixOf`) es
+        CompilerError es -> True H.@=? any containsIncorrectOptionMessage es
         _                -> H.assertFailure "Expecting CompilerError"
     cleanTestEnv
   where
     compiler = getResourceString >>= withItemBody (unixFilter "head" ["-#"])
+    incorrectOptionMessages = ["invalid option", "illegal option"]
+    containsIncorrectOptionMessage output = any (`isInfixOf` output) incorrectOptionMessages
diff --git a/tests/Hakyll/Web/Template/Context/Tests.hs b/tests/Hakyll/Web/Template/Context/Tests.hs
--- a/tests/Hakyll/Web/Template/Context/Tests.hs
+++ b/tests/Hakyll/Web/Template/Context/Tests.hs
@@ -41,6 +41,10 @@
             dateField "date" "%B %e, %Y"
     date2 @=? "August 26, 2010"
 
+    date3 <- testContextDone store provider
+        "posts/2018-09-26.md" "date" $
+            dateField "date" "%B %e, %Y"
+    date3 @=? "September 26, 2018"
     cleanTestEnv
 
 
