module Data.Time.Hora.Format
(
Format(..),
format,
format',
show') where
import Data.Maybe
import Data.String
import Data.Time.Clock
import Data.Time.Format (formatTime,defaultTimeLocale,FormatTime(..))
import Data.Time.Hora.Type hiding (Min)
import Data.Time.LocalTime as L
import Data.Time.Hora.Part
import qualified Data.Time.Hora.Internal.DatePartSmall as S
import Data.Time.Hora.Internal.Pad
format::[Format] -> UTCTime -> String
format lf0 utc0 = withDefaultLocale (build lf0) utc0
format'::Tz' tz =>
[Format] -> tz -> UTCTime -> Tz String
format' lf0 tz0 utc0 = Tz tz1 $ withDefaultLocale (build lf0) zt1
where zt1 = utcToZonedTime tz1 utc0::ZonedTime
tz1 = tz' tz0 utc0
withDefaultLocale::FormatTime t =>
String
-> t
-> String
withDefaultLocale = formatTime defaultTimeLocale
instance IsString Format where
fromString = Raw
data Format =
Raw String
| Tab
| Crlf
| Offset
| Zone
| Hm
| Hms
| AM
| Am
| H_24
| H_12
| Min
| S
| Fraction_fixed
| Fraction
| Y_m_d
| Y
| Month
| Mth
| Mth_1_12
| D
| D_wk_1_7
| D_wk_0_6
| D_wk
| D_week
| Wk_year_Sun
| Wk_year_Mon
class Build f where
build::f -> String
instance Build [Format] where
build = concat . (build <$>)
instance Build Format where
build f0 = case f0 of
Raw s1 -> s1
Tab -> "%t"
Crlf -> "%n"
Offset -> "%z"
Zone -> "%Z"
Hm -> "%R"
Hms -> "%T"
AM -> "%p"
Am -> "%P"
H_24 -> "%H"
H_12 -> "%I"
Min -> "%M"
S -> "%S"
Fraction_fixed -> "%q"
Fraction -> "%Q"
Y_m_d -> "%F"
Y -> "%Y"
Month -> "%B"
Mth -> "%b"
Mth_1_12 -> "%m"
D -> "%d"
D_wk_1_7 -> "%u"
D_wk_0_6 -> "%w"
D_wk -> "%a"
D_week -> "%A"
Wk_year_Sun -> "%U"
Wk_year_Mon -> "%W"
show'::DatePartSmall -> String
show' dp0
| (Day d0) <- dp0
= format [Y_m_d] $ fromJust $ toUtc $ DatePartSmall d0 0 0
| (Day' d0) <- dp0
= "+" <> (show d0)
| (S.Min m0) <- dp0
= let hr1 = m0 `div` 60
min1 = m0 `rem` 60
in pad1 (show hr1) <> ":" <> pad1 (show min1)
| (S.Min' m0) <- dp0
= "+" <> (show' $ S.Min m0)
| (S.Ms ms0) <- dp0
= let sec1 = ms0 `div` 1000
ms1 = ms0 `rem` 1000
in pad1 (show sec1) <> "." <> (pad '0' 3 $ show ms1)
| (S.Ms' ms0) <- dp0
= "+" <> (show' $ S.Ms ms0)
| (S.Time m0 ms0) <- dp0
= show' (S.Min m0) <> ":" <> show' (S.Ms ms0)
| (S.DatePartSmall d0 m0 ms0) <- dp0
= show' (S.Day d0) <> " " <> show' (S.Min m0) <> ":" <> show' (S.Ms ms0)
| (S.Neg dp0) <- dp0
= let _:s1 = show' dp0
in "-" <> s1
| otherwise = show dp0
where pad1 = pad '0' 2