@@ -16,7 +16,7 @@ import Prelude
1616
1717import Control.Alt ((<|>))
1818import Control.Alternative (class Alternative )
19- import Control.Apply (lift2 )
19+ import Control.Apply (applySecond , lift2 )
2020import Control.Lazy as Z
2121import Control.Monad.Reader.Trans (ReaderT , runReaderT , ask )
2222import Control.Monad.State (State , modify , put , runState )
@@ -27,7 +27,7 @@ import Data.DateTime as DT
2727import Data.DateTime.Instant (instant , toDateTime , fromDateTime , unInstant )
2828import Data.Either (Either (..), either )
2929import Data.Enum (fromEnum , toEnum )
30- import Data.Foldable (foldMap )
30+ import Data.Foldable (foldMap , for_ )
3131import Data.Formatter.Internal (foldDigits )
3232import Data.Formatter.Parser.Number (parseDigit )
3333import Data.Formatter.Parser.Utils (runP , oneOfAs )
@@ -237,15 +237,14 @@ initialAccum =
237237 }
238238
239239unformatAccumToDateTime ∷ UnformatAccum → Either String DT.DateTime
240- unformatAccumToDateTime a =
240+ unformatAccumToDateTime a = applySecond (validAccum a) $
241241 DT.DateTime
242242 <$> (D .canonicalDate
243243 <$> (maybe (Left " Incorrect year" ) pure $ toEnum $ fromMaybe zero a.year)
244244 <*> (maybe (Left " Incorrect month" ) pure $ toEnum $ fromMaybe one a.month)
245245 <*> (maybe (Left " Incorrect day" ) pure $ toEnum
246- $ adjustDay a.meridiem a. hour
246+ $ adjustDay a.hour
247247 $ fromMaybe one a.day))
248-
249248 <*> (T.Time
250249 <$> (maybe
251250 (Left " Incorrect hour" ) pure
@@ -256,9 +255,15 @@ unformatAccumToDateTime a =
256255 <*> (maybe (Left " Incorrect second" ) pure $ toEnum $ fromMaybe zero a.second)
257256 <*> (maybe (Left " Incorrect millisecond" ) pure $ toEnum $ fromMaybe zero a.millisecond))
258257
259- adjustDay ∷ Maybe Meridiem → Maybe Int → Int → Int
260- adjustDay Nothing (Just 24 ) n = n + 1
261- adjustDay _ _ n = n
258+ validAccum :: UnformatAccum → Either String Unit
259+ validAccum { hour, minute, second, millisecond } = case hour of
260+ Just 24 → for_ [minute, second, millisecond] \val ->
261+ when (fromMaybe 0 val > 0 ) $ Left " When hour is 24, other time component must be 0"
262+ _ -> pure unit
263+
264+ adjustDay ∷ Maybe Int → Int → Int
265+ adjustDay (Just 24 ) n = n + 1
266+ adjustDay _ n = n
262267
263268adjustMeridiem ∷ Maybe Meridiem → Int → Int
264269adjustMeridiem (Just AM ) 12 = 0
0 commit comments