diff --git a/config/settings.yml b/config/settings.yml index 196f8e97e..d305be6a2 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -132,7 +132,7 @@ user-defaults: max-favourite-terms: 2 theme: Default date-time-format: "%a %d %b %Y %R" - date-format: "%d.%m.%Y" + date-format: "%a %d %b %Y" time-format: "%R" download-files: false warning-days: 1209600 diff --git a/src/Handler/Utils/DateTime.hs b/src/Handler/Utils/DateTime.hs index a83efa0af..419788526 100644 --- a/src/Handler/Utils/DateTime.hs +++ b/src/Handler/Utils/DateTime.hs @@ -34,6 +34,8 @@ import Data.Time.Clock.System (systemEpochDay) import qualified Data.Csv as Csv +import qualified Data.Char as Char + ------------- -- UTCTime -- @@ -84,7 +86,7 @@ instance HasLocalTime TimeOfDay where toLocalTime = LocalTime systemEpochDay formatTime' :: (HasLocalTime t, MonadHandler m) => String -> t -> m Text -formatTime' fmtStr t = fmap fromString $ Time.formatTime <$> getTimeLocale <*> pure fmtStr <*> pure (toLocalTime t) +formatTime' fmtStr t = fmap fromString $ Time.formatTime <$> getTimeLocale <*> pure fmtStr <*> pure (utcToZonedTime . localTimeToUTCTZ appTZ $ toLocalTime t) -- formatTime :: (FormatTime t, MonadHandler m, HandlerSite m ~ UniWorX, IsString str) => (DateTimeFormat -> String) -> t -> m str -- Restricted type for safety @@ -123,33 +125,50 @@ getDateTimeFormat sel = do validDateTimeFormats :: TimeLocale -> SelDateTimeFormat -> Set DateTimeFormat -- ^ We use a whitelist instead of just letting the user specify their own format string since vulnerabilities in printf-like functions are not uncommon -validDateTimeFormats _ SelFormatDateTime = Set.fromList - [ DateTimeFormat "%a %d %b %Y %R" - , DateTimeFormat "%a %b %d %Y %R" - , DateTimeFormat "%A, %d %B %Y %R" - , DateTimeFormat "%A, %B %d %Y %R" - , DateTimeFormat "%a %d %b %Y %T" - , DateTimeFormat "%a %b %d %Y %T" - , DateTimeFormat "%A, %d %B %Y %T" - , DateTimeFormat "%A, %B %d %Y %T" - , DateTimeFormat "%d.%m.%Y %R" - , DateTimeFormat "%d.%m.%Y %T" - , DateTimeFormat "%a %d.%m.%y %R" - , DateTimeFormat "%R %d.%m.%Y" - , DateTimeFormat "%T %d.%m.%Y" - , DateTimeFormat "%Y-%m-%d %R" - , DateTimeFormat "%Y-%m-%d %T" +validDateTimeFormats tl SelFormatDateTime = Set.fromList $ + [ DateTimeFormat "%Y-%m-%dT%R" , DateTimeFormat "%Y-%m-%dT%T" + ] ++ + [ DateTimeFormat $ unwords [firstF, secondF] + | DateTimeFormat tFormat <- Set.toList $ validDateTimeFormats tl SelFormatTime + , DateTimeFormat dFormat <- Set.toList $ validDateTimeFormats tl SelFormatDate + , (firstF, secondF) <- [(tFormat, dFormat), (dFormat, tFormat)] + ] ++ + [ DateTimeFormat $ unwords [dayFmt, timeFmt, yearFmt] + | dayFmt <- [ "%a %d %b" + , "%a %b %d" + , "%A, %d %B" + , "%A, %B %d" + , "%d.%m" + , "%a %d.%m" + , "%A %d.%m" + ] + , timeFmt <- [ "%R" + , "%T" + ] + , yearFmt <- [ "%y", "%Y" ] ] validDateTimeFormats _ SelFormatDate = Set.fromList [ DateTimeFormat "%a %d %b %Y" , DateTimeFormat "%a %b %d %Y" + , DateTimeFormat "%d %b %Y" + , DateTimeFormat "%b %d %Y" + , DateTimeFormat "%d %B %Y" + , DateTimeFormat "%B %d %Y" + , DateTimeFormat "%d %b %y" + , DateTimeFormat "%b %d %y" + , DateTimeFormat "%d %B %y" + , DateTimeFormat "%B %d %y" , DateTimeFormat "%A, %d %B %Y" , DateTimeFormat "%A, %B %d %Y" + , DateTimeFormat "%A, %d %b %Y" + , DateTimeFormat "%A, %b %d %Y" , DateTimeFormat "%d.%m.%y" , DateTimeFormat "%d.%m.%Y" , DateTimeFormat "%a %d.%m.%y" , DateTimeFormat "%a %d.%m.%Y" + , DateTimeFormat "%A %d.%m.%y" + , DateTimeFormat "%A %d.%m.%Y" , DateTimeFormat "%Y-%m-%d" , DateTimeFormat "%y-%m-%d" ] @@ -162,8 +181,13 @@ validDateTimeFormats TimeLocale{..} SelFormatTime = Set.fromList . concat . catM guard $ uncurry (/=) amPm Just [ DateTimeFormat "%I:%M %p" - , DateTimeFormat "%I:%M %P" , DateTimeFormat "%I:%M:%S %p" + ] + , do + guard $ uncurry (/=) amPm + guard $ any (any $ not . Char.isLower) [fst amPm, snd amPm] + Just + [ DateTimeFormat "%I:%M %P" , DateTimeFormat "%I:%M:%S %P" ] ]