convert: give a useful error, not a null date when parsing fails; refactor

This commit is contained in:
Simon Michael 2011-09-28 17:12:43 +00:00
parent bdbc93ca5c
commit 602ccceeec

View File

@ -426,17 +426,35 @@ transactionFromCsvRecord rules fields =
-- | Convert some date string with unknown format to YYYY/MM/DD. -- | Convert some date string with unknown format to YYYY/MM/DD.
normaliseDate :: Maybe String -- ^ User-supplied date format: this should be tried in preference to all others normaliseDate :: Maybe String -- ^ User-supplied date format: this should be tried in preference to all others
-> String -> String -> String -> String
normaliseDate mb_user_format s = maybe "0000/00/00" showDate $ normaliseDate mb_user_format s =
firstJust $ let parsewith = flip (parseTime defaultTimeLocale) s in
(maybe id (\user_format -> (parseTime defaultTimeLocale user_format s :)) mb_user_format) $ maybe (error' $ "could not parse \""++s++"\" as a date, consider adding a date-format directive or upgrading")
[parseTime defaultTimeLocale "%Y/%m/%e" s showDate $
-- can't parse a month without leading 0, try adding one firstJust $ (map parsewith $
,parseTime defaultTimeLocale "%Y/%m/%e" (take 5 s ++ "0" ++ drop 5 s) maybe [] (:[]) mb_user_format
-- the - modifier requires time-1.2.0.5, released
-- in 2011/5, so for now we emulate it for wider
-- compatibility. time < 1.2.0.5 also has a buggy
-- %y which we don't do anything about.
-- ++ [
-- "%Y/%m/%d"
-- ,"%Y/%-m/%-d"
-- ,"%Y-%m-%d"
-- ,"%Y-%-m-%-d"
-- ,"%m/%d/%Y"
-- ,"%-m/%-d/%Y"
-- ,"%m-%d-%Y"
-- ,"%-m-%-d-%Y"
-- ]
)
++ [
parseTime defaultTimeLocale "%Y/%m/%e" s
,parseTime defaultTimeLocale "%Y-%m-%e" s ,parseTime defaultTimeLocale "%Y-%m-%e" s
,parseTime defaultTimeLocale "%Y-%m-%e" (take 5 s ++ "0" ++ drop 5 s)
,parseTime defaultTimeLocale "%m/%e/%Y" s ,parseTime defaultTimeLocale "%m/%e/%Y" s
,parseTime defaultTimeLocale "%m/%e/%Y" ('0':s)
,parseTime defaultTimeLocale "%m-%e-%Y" s ,parseTime defaultTimeLocale "%m-%e-%Y" s
,parseTime defaultTimeLocale "%Y/%m/%e" (take 5 s ++ "0" ++ drop 5 s)
,parseTime defaultTimeLocale "%Y-%m-%e" (take 5 s ++ "0" ++ drop 5 s)
,parseTime defaultTimeLocale "%m/%e/%Y" ('0':s)
,parseTime defaultTimeLocale "%m-%e-%Y" ('0':s) ,parseTime defaultTimeLocale "%m-%e-%Y" ('0':s)
] ]