diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,17 @@
 Changelog
 
+# [3.1.0](https://github.com/haskell-github-trust/megaparsec-time/compare/3.0.0...3.1.0) (2026-11-10)
+
+
+### Bug Fixes
+
+* commit cabal file ([47720a3](https://github.com/haskell-github-trust/megaparsec-time/commit/47720a368b25024780b420a7c4fb117697243f89))
+
+
+### Features
+
+* support days in duration parser ([532f879](https://github.com/haskell-github-trust/megaparsec-time/commit/532f879b362e05d08d8a37caf9a787c27b1d8e36))
+
 # [3.0.0](https://github.com/haskell-github-trust/megaparsec-time/compare/2.0.2...3.0.0) (2026-10-25)
 
 ## [2.0.2](https://github.com/haskell-github-trust/megaparsec-time/compare/2.0.1...2.0.2) (2025-08-07)
diff --git a/megaparsec-time.cabal b/megaparsec-time.cabal
--- a/megaparsec-time.cabal
+++ b/megaparsec-time.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           megaparsec-time
-version:        0.3.0.0
+version:        0.3.1.0
 synopsis:       Parsers and utilities for the Megaparsec library.
 description:    Common parsers and utilities to use with the Megaparsec library.
 category:       Parsing
@@ -20,7 +20,6 @@
 tested-with:
     GHC == 9.10
   , GHC == 9.8
-  , GHC == 9.6
 extra-source-files:
     README.md
     CHANGELOG.md
diff --git a/src/Text/Megaparsec/Time.hs b/src/Text/Megaparsec/Time.hs
--- a/src/Text/Megaparsec/Time.hs
+++ b/src/Text/Megaparsec/Time.hs
@@ -13,6 +13,7 @@
   DayResult,
 
   -- * Simple parsers
+  Char.daysParser,
   Char.hoursParser,
   Char.minutesParser,
   Char.secondsParser,
diff --git a/src/Text/Megaparsec/Time/Byte.hs b/src/Text/Megaparsec/Time/Byte.hs
--- a/src/Text/Megaparsec/Time/Byte.hs
+++ b/src/Text/Megaparsec/Time/Byte.hs
@@ -14,6 +14,7 @@
 -- 'Data.ByteString.ByteString').
 module Text.Megaparsec.Time.Byte (
   -- * Simple parsers
+  daysParser,
   hoursParser,
   minutesParser,
   secondsParser,
@@ -67,7 +68,7 @@
   => m DayResult
 dayParser = mkDayParser char' fromChar digitChar toChar
 
--- | Parse a 'NominalDiffTime' using strings like @1h23m45s@, with all
+-- | Parse a 'NominalDiffTime' using strings like @2d1h23m45s@, with all
 -- components being optional as long as one is present.
 --
 -- @since 0.3.0.0
@@ -76,7 +77,17 @@
   => MonadParsec e s m
   => Token s ~ Word8
   => m NominalDiffTime
-durationParser = mkDurationParser space hoursParser minutesParser secondsParser
+durationParser = mkDurationParser space daysParser hoursParser minutesParser secondsParser
+
+-- | Parse a 'NominalDiffTime' from a number of days from a string like @1d@.
+--
+-- @since 0.3.1.0
+daysParser
+  :: MonadFail m
+  => MonadParsec e s m
+  => Token s ~ Word8
+  => m NominalDiffTime
+daysParser = secondsToNominalDiffTime . (* 86400) <$> posNumParser <* char (fromChar 'd')
 
 -- | Parse a Gregorian 'Day' from a @%F@ or @%d\/%m\/%Y@ format.
 --
diff --git a/src/Text/Megaparsec/Time/Char.hs b/src/Text/Megaparsec/Time/Char.hs
--- a/src/Text/Megaparsec/Time/Char.hs
+++ b/src/Text/Megaparsec/Time/Char.hs
@@ -14,6 +14,7 @@
 -- lazy 'Text').
 module Text.Megaparsec.Time.Char (
   -- * Simple parsers
+  daysParser,
   hoursParser,
   minutesParser,
   secondsParser,
@@ -65,7 +66,7 @@
   => m DayResult
 dayParser = mkDayParser char' id digitChar id
 
--- | Parse a 'NominalDiffTime' using strings like @1h23m45s@, with all
+-- | Parse a 'NominalDiffTime' using strings like @2d1h23m45s@, with all
 -- components being optional as long as one is present.
 --
 -- @since 0.3.0.0
@@ -74,7 +75,17 @@
   => MonadParsec e s m
   => Token s ~ Char
   => m NominalDiffTime
-durationParser = mkDurationParser space hoursParser minutesParser secondsParser
+durationParser = mkDurationParser space daysParser hoursParser minutesParser secondsParser
+
+-- | Parse a 'NominalDiffTime' from a number of days from a string like @1d@.
+--
+-- @since 0.3.1.0
+daysParser
+  :: MonadFail m
+  => MonadParsec e s m
+  => Token s ~ Char
+  => m NominalDiffTime
+daysParser = secondsToNominalDiffTime . (* 86400) <$> posNumParser <* char 'd'
 
 -- | Parse a Gregorian 'Day' from a @%F@ or @%d\/%m\/%Y@ format.
 --
diff --git a/src/Text/Megaparsec/Time/Common.hs b/src/Text/Megaparsec/Time/Common.hs
--- a/src/Text/Megaparsec/Time/Common.hs
+++ b/src/Text/Megaparsec/Time/Common.hs
@@ -85,17 +85,17 @@
     ]
  where
   str = try . traverse_ (char' . fromChar)
-  shortDay = choice $ map (dayString (take 3 . show)) weekDays
-  longDay = choice $ map (dayString show) weekDays
+  shortDay = choice $ fmap (dayString (take 3 . show)) weekDays
+  longDay = choice $ fmap (dayString show) weekDays
   dayString f d = str (f d) $> d
   weekDays = [Monday .. Friday]
   sign = (str "-" $> negate) <|> (str "+" $> id)
-  digits = map toChar <$> some digitChar
+  digits = fmap toChar <$> some digitChar
   absoluteDay = toEnum . read <$> digits
   relativeDay = ($) <$> sign <*> (read <$> digits)
 
--- | Build a 'NominalDiffTime' parser from hours, minutes and seconds parsers,
--- with all components being optional as long as one is present.
+-- | Build a 'NominalDiffTime' parser from days, hours, minutes and seconds
+-- parsers, with all components being optional as long as one is present.
 --
 -- @since 0.3.0.0
 mkDurationParser
@@ -103,15 +103,21 @@
   => m ()
   -- ^ Space parser.
   -> m NominalDiffTime
+  -- ^ Days parser.
+  -> m NominalDiffTime
   -- ^ Hours parser.
   -> m NominalDiffTime
   -- ^ Minutes parser.
   -> m NominalDiffTime
   -- ^ Seconds parser.
   -> m NominalDiffTime
-mkDurationParser space hoursParser minutesParser secondsParser =
-  try hours <|> try minutes <|> secondsParser
+mkDurationParser space daysParser hoursParser minutesParser secondsParser =
+  try days <|> hms
  where
+  days = (+) <$> (daysParser <* space) <*> (fromMaybe 0 <$> optional (try hms))
+
+  hms = try hours <|> try minutes <|> secondsParser
+
   hours = do
     h <- hoursParser <* space
     m <- fromMaybe 0 <$> optional (try minutes)
@@ -135,7 +141,7 @@
   -- ^ Convert a token to a 'Char'.
   -> m Day
 mkGregorianDayParser toChar = do
-  s <- map toChar <$> many anySingle
+  s <- fmap toChar <$> many anySingle
 
   let parseTime = flip (parseTimeM False defaultTimeLocale) s
 
@@ -154,8 +160,8 @@
   -- ^ Convert a token to a 'Char'.
   -> m TimeOfDay
 mkTimeParser digitChar colon toChar = do
-  h <- read . map toChar <$> replicateM 2 digitChar <* colon
-  m <- read . map toChar <$> replicateM 2 digitChar
+  h <- read . fmap toChar <$> replicateM 2 digitChar <* colon
+  m <- read . fmap toChar <$> replicateM 2 digitChar
 
   maybe
     (fail (printf "invalid hours or minutes %02d:%02d" h m))
diff --git a/test/Text/Megaparsec/TimeSpec.hs b/test/Text/Megaparsec/TimeSpec.hs
--- a/test/Text/Megaparsec/TimeSpec.hs
+++ b/test/Text/Megaparsec/TimeSpec.hs
@@ -38,6 +38,7 @@
 import Text.Megaparsec.Time (
   dateParser,
   dayParser,
+  daysParser,
   durationParser,
   gregorianDayParser,
   hoursParser,
@@ -143,6 +144,10 @@
       parseOrPrettyError dayParser (printf "+%d" (x :: Int)) `shouldSatisfy` isLeft
 
   describe "duration" $ do
+    it "days" . forAll positive $ \d ->
+      parseOrPrettyError daysParser (printf "%dd" d)
+        `shouldBe` Right (secondsToNominalDiffTime (fromInteger d * 86400))
+
     it "hours" . forAll positive $ \h ->
       parseOrPrettyError hoursParser (printf "%dh" h)
         `shouldBe` Right (secondsToNominalDiffTime (fromInteger h * 3600))
@@ -161,6 +166,22 @@
           `shouldBe` Right (secondsToNominalDiffTime (fromInteger s))
 
     context "duration" $ do
+      context "days" $ do
+        it "dhms" . forAll ((,,,) <$> positive <*> positive <*> positive <*> positive) $ \(d, h, m, s) ->
+          parseOrPrettyError durationParser (printf "%dd %dh %dm %ds" d h m s)
+            `shouldBe` Right (secondsToNominalDiffTime (fromInteger ((((d * 24 + h) * 60 + m) * 60) + s)))
+
+        it "d" . forAll positive $ \d ->
+          parseOrPrettyError durationParser (printf "%dd" d)
+            `shouldBe` Right (secondsToNominalDiffTime (fromInteger (d * 86400)))
+
+        it "ds" . forAll ((,) <$> positive <*> positive) $ \(d, s) ->
+          parseOrPrettyError durationParser (printf "%dd%d" d s)
+            `shouldBe` Right (secondsToNominalDiffTime (fromInteger (d * 86400 + s)))
+
+      it "empty" $
+        parseOrPrettyError durationParser "" `shouldSatisfy` isLeft
+
       context "hours" $ do
         it "hms" . forAll ((,,) <$> positive <*> positive <*> positive) $ \(h, m, s) ->
           parseOrPrettyError durationParser (printf "%dh %dm %ds" h m s)
