]> gitweb @ CieloNegro.org - time-http.git/blobdiff - Data/Time/RFC733/Internal.hs
Tests for Data.Time.RFC733
[time-http.git] / Data / Time / RFC733 / Internal.hs
index d1de6d864014437577cc95654705161be866d18e..4037918b7ff4409b1d3a5449e45260eb7560bfc1 100644 (file)
@@ -2,14 +2,21 @@
     OverloadedStrings
   , UnicodeSyntax
   #-}
+-- |Internal functions for "Data.Time.RFC733".
 module Data.Time.RFC733.Internal
     ( rfc733DateAndTime
+    , toAsciiBuilder
     )
     where
+import Data.Ascii (AsciiBuilder)
+import qualified Data.Ascii as A
 import Control.Applicative
 import Data.Attoparsec.Char8
+import Data.Monoid.Unicode
 import Data.Time
+import Data.Time.Calendar.WeekDate
 import Data.Time.HTTP.Common
+import Data.Time.RFC822.Internal hiding (toAsciiBuilder)
 
 -- |Parse RFC 733 date and time strings.
 rfc733DateAndTime ∷ Parser ZonedTime
@@ -105,3 +112,28 @@ zone = choice [ string "GMT" *> return (TimeZone 0 False "GMT")
               , char 'Z' *> return (TimeZone 0 False "Z")
               , read4digitsTZ
               ]
+
+-- |Convert a 'ZonedTime' to RFC 733 date and time string.
+toAsciiBuilder ∷ ZonedTime → AsciiBuilder
+toAsciiBuilder zonedTime
+    = let localTime          = zonedTimeToLocalTime zonedTime
+          timeZone           = zonedTimeZone zonedTime
+          (year, month, day) = toGregorian (localDay localTime)
+          (_, _, week)       = toWeekDate  (localDay localTime)
+          timeOfDay          = localTimeOfDay localTime
+      in
+        longWeekDayName week
+        ⊕ A.toAsciiBuilder ", "
+        ⊕ show2 day
+        ⊕ A.toAsciiBuilder "-"
+        ⊕ shortMonthName month
+        ⊕ A.toAsciiBuilder "-"
+        ⊕ show4 year
+        ⊕ A.toAsciiBuilder " "
+        ⊕ show2 (todHour timeOfDay)
+        ⊕ A.toAsciiBuilder ":"
+        ⊕ show2 (todMin timeOfDay)
+        ⊕ A.toAsciiBuilder ":"
+        ⊕ show2 (floor (todSec timeOfDay) ∷ Int)
+        ⊕ A.toAsciiBuilder " "
+        ⊕ showRFC822TimeZone timeZone