diff --git a/hledger-lib/Hledger/Read/JournalReader.hs b/hledger-lib/Hledger/Read/JournalReader.hs index b1433c347..679d276dc 100644 --- a/hledger-lib/Hledger/Read/JournalReader.hs +++ b/hledger-lib/Hledger/Read/JournalReader.hs @@ -388,12 +388,19 @@ ledgerdatetime = do day <- ledgerdate many1 spacenonewline h <- many1 digit + let h' = read h + guard $ h' >= 0 && h' <= 23 char ':' m <- many1 digit + let m' = read m + guard $ m' >= 0 && m' <= 59 s <- optionMaybe $ do char ':' many1 digit - let tod = TimeOfDay (read h) (read m) (maybe 0 (fromIntegral.read) s) + let s' = case s of Just sstr -> read sstr + Nothing -> 0 + guard $ s' >= 0 && s' <= 59 + let tod = TimeOfDay h' m' (fromIntegral s') return $ LocalTime day tod ledgereffectivedate :: Day -> GenParser Char JournalContext Day @@ -721,6 +728,15 @@ tests_Hledger_Read_JournalReader = TestList [ assertParseFailure (parseWithCtx nullctx ledgerdate "1/1") assertParse (parseWithCtx nullctx{ctxYear=Just 2011} ledgerdate "1/1") + ,"ledgerdatetime" ~: do + assertParseFailure (parseWithCtx nullctx ledgerdatetime "2011/1/1") + assertParseFailure (parseWithCtx nullctx ledgerdatetime "2011/1/1 24:00:00") + assertParseFailure (parseWithCtx nullctx ledgerdatetime "2011/1/1 00:60:00") + assertParseFailure (parseWithCtx nullctx ledgerdatetime "2011/1/1 00:00:60") + assertParse (parseWithCtx nullctx ledgerdatetime "2011/1/1 00:00") + assertParse (parseWithCtx nullctx ledgerdatetime "2011/1/1 23:59:59") + assertParse (parseWithCtx nullctx ledgerdatetime "2011/1/1 3:5:7") + ,"ledgerDefaultYear" ~: do assertParse (parseWithCtx nullctx ledgerDefaultYear "Y 2010\n") assertParse (parseWithCtx nullctx ledgerDefaultYear "Y 10001\n")