[commit: packages/time] master: instance FormatTime UniversalTime; instance ParseTime UniversalTime; instance Read UniversalTime (1ca245b)

git at git.haskell.org git at git.haskell.org
Sun Dec 20 07:56:14 UTC 2015


Repository : ssh://git@git.haskell.org/time

On branch  : master
Link       : http://git.haskell.org/packages/time.git/commitdiff/1ca245b63dcb9b409be9ecc2b034b821d24af8f9

>---------------------------------------------------------------

commit 1ca245b63dcb9b409be9ecc2b034b821d24af8f9
Author: Ashley Yakeley <ashley at yakeley.org>
Date:   Sat Feb 21 03:09:37 2015 -0800

    instance FormatTime UniversalTime; instance ParseTime UniversalTime; instance Read UniversalTime


>---------------------------------------------------------------

1ca245b63dcb9b409be9ecc2b034b821d24af8f9
 lib/Data/Time/Clock/Scale.hs  |  3 +++
 lib/Data/Time/Format.hs       |  9 ++++++---
 lib/Data/Time/Format/Parse.hs |  6 ++++++
 test/Test/TestParseTime.hs    | 22 +++++++++++++++++++++-
 4 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/lib/Data/Time/Clock/Scale.hs b/lib/Data/Time/Clock/Scale.hs
index c511829..8700e32 100644
--- a/lib/Data/Time/Clock/Scale.hs
+++ b/lib/Data/Time/Clock/Scale.hs
@@ -24,6 +24,9 @@ import Data.Data
 -- | The Modified Julian Date is the day with the fraction of the day, measured from UT midnight.
 -- It's used to represent UT1, which is time as measured by the earth's rotation, adjusted for various wobbles.
 --
+-- For the 'Read' instance of 'UniversalTime',
+-- import "Data.Time" or "Data.Time.Format".
+--
 -- For the 'Show' instance of 'UniversalTime',
 -- import "Data.Time" or "Data.Time.LocalTime".
 newtype UniversalTime = ModJulianDate {getModJulianDate :: Rational} deriving (Eq,Ord
diff --git a/lib/Data/Time/Format.hs b/lib/Data/Time/Format.hs
index d9f0050..e3fe96b 100644
--- a/lib/Data/Time/Format.hs
+++ b/lib/Data/Time/Format.hs
@@ -58,11 +58,11 @@ formatChar c locale mpado t = case (formatCharacter c) of
 --
 -- [@%Z@] timezone name
 --
--- For 'LocalTime' (and 'ZonedTime' and 'UTCTime'):
+-- For 'LocalTime' (and 'ZonedTime' and 'UTCTime' and 'UniversalTime'):
 --
 -- [@%c@] as 'dateTimeFmt' @locale@ (e.g. @%a %b %e %H:%M:%S %Z %Y@)
 --
--- For 'TimeOfDay' (and 'LocalTime' and 'ZonedTime' and 'UTCTime'):
+-- For 'TimeOfDay' (and 'LocalTime' and 'ZonedTime' and 'UTCTime' and 'UniversalTime'):
 --
 -- [@%R@] same as @%H:%M@
 --
@@ -100,7 +100,7 @@ formatChar c locale mpado t = case (formatCharacter c) of
 -- the decimals are positive, not negative. For example, 0.9 seconds
 -- before the Unix epoch is formatted as @-1.1@ with @%s%Q at .
 --
--- For 'Day' (and 'LocalTime' and 'ZonedTime' and 'UTCTime'):
+-- For 'Day' (and 'LocalTime' and 'ZonedTime' and 'UTCTime' and 'UniversalTime'):
 --
 -- [@%D@] same as @%m\/%d\/%y@
 --
@@ -244,3 +244,6 @@ instance FormatTime Day where
 
 instance FormatTime UTCTime where
     formatCharacter c = fmap (\f locale mpado t -> f locale mpado (utcToZonedTime utc t)) (formatCharacter c)
+
+instance FormatTime UniversalTime where
+    formatCharacter c = fmap (\f locale mpado t -> f locale mpado (ut1ToLocalTime 0 t)) (formatCharacter c)
diff --git a/lib/Data/Time/Format/Parse.hs b/lib/Data/Time/Format/Parse.hs
index 07dc5b2..0bd698d 100644
--- a/lib/Data/Time/Format/Parse.hs
+++ b/lib/Data/Time/Format/Parse.hs
@@ -464,6 +464,9 @@ instance ParseTime ZonedTime where
 instance ParseTime UTCTime where
     buildTime l = zonedTimeToUTC . buildTime l
 
+instance ParseTime UniversalTime where
+    buildTime l = localTimeToUT1 0 . buildTime l
+
 -- * Read instances for time package types
 
 #if LANGUAGE_Rank2Types
@@ -485,5 +488,8 @@ instance Read ZonedTime where
 
 instance Read UTCTime where
     readsPrec n s = [ (zonedTimeToUTC t, r) | (t,r) <- readsPrec n s ]
+
+instance Read UniversalTime where
+    readsPrec n s = [ (localTimeToUT1 0 t, r) | (t,r) <- readsPrec n s ]
 #endif
 
diff --git a/test/Test/TestParseTime.hs b/test/Test/TestParseTime.hs
index 26ee67d..4c65fbd 100644
--- a/test/Test/TestParseTime.hs
+++ b/test/Test/TestParseTime.hs
@@ -286,6 +286,13 @@ instance Arbitrary UTCTime where
 instance CoArbitrary UTCTime where
     coarbitrary t = coarbitrary (truncate (utcTimeToPOSIXSeconds t) :: Integer)
 
+instance Arbitrary UniversalTime where
+    arbitrary = liftM (\n -> ModJulianDate $ n % k) $ choose (-313698 * k, 2973483 * k) where -- 1000-01-1 to 9999-12-31
+        k = 86400
+
+instance CoArbitrary UniversalTime where
+    coarbitrary (ModJulianDate d) = coarbitrary d
+
 -- missing from the time package
 instance Eq ZonedTime where
     ZonedTime t1 tz1 == ZonedTime t2 tz2 = t1 == t2 && tz1 == tz2
@@ -438,7 +445,8 @@ properties =
      ("prop_read_show LocalTime", property (prop_read_show :: LocalTime -> Result)),
      ("prop_read_show TimeZone", property (prop_read_show :: TimeZone -> Result)),
      ("prop_read_show ZonedTime", property (prop_read_show :: ZonedTime -> Result)),
-     ("prop_read_show UTCTime", property (prop_read_show :: UTCTime -> Result))]
+     ("prop_read_show UTCTime", property (prop_read_show :: UTCTime -> Result)),
+     ("prop_read_show UniversalTime", property (prop_read_show :: UniversalTime -> Result))]
  ++ [("prop_parse_showWeekDate", property prop_parse_showWeekDate),
      ("prop_parse_showGregorian", property prop_parse_showGregorian),
      ("prop_parse_showOrdinalDate", property prop_parse_showOrdinalDate)]
@@ -449,6 +457,7 @@ properties =
  ++ map (prop_parse_format_named "TimeZone") timeZoneFormats
  ++ map (prop_parse_format_named "ZonedTime") zonedTimeFormats
  ++ map (prop_parse_format_named "UTCTime") utcTimeFormats
+ ++ map (prop_parse_format_named "UniversalTime") universalTimeFormats
 
  ++ map (prop_parse_format_upper_named "Day") dayFormats
  ++ map (prop_parse_format_upper_named "TimeOfDay") timeOfDayFormats
@@ -456,6 +465,7 @@ properties =
  ++ map (prop_parse_format_upper_named "TimeZone") timeZoneFormats
  ++ map (prop_parse_format_upper_named "ZonedTime") zonedTimeFormats
  ++ map (prop_parse_format_upper_named "UTCTime") utcTimeFormats
+ ++ map (prop_parse_format_upper_named "UniversalTime") universalTimeFormats
 
  ++ map (prop_parse_format_lower_named "Day") dayFormats
  ++ map (prop_parse_format_lower_named "TimeOfDay") timeOfDayFormats
@@ -463,12 +473,14 @@ properties =
  ++ map (prop_parse_format_lower_named "TimeZone") timeZoneFormats
  ++ map (prop_parse_format_lower_named "ZonedTime") zonedTimeFormats
  ++ map (prop_parse_format_lower_named "UTCTime") utcTimeFormats
+ ++ map (prop_parse_format_lower_named "UniversalTime") universalTimeFormats
 
  ++ map (prop_format_parse_format_named "Day") partialDayFormats
  ++ map (prop_format_parse_format_named "TimeOfDay") partialTimeOfDayFormats
  ++ map (prop_format_parse_format_named "LocalTime") partialLocalTimeFormats
  ++ map (prop_format_parse_format_named "ZonedTime") partialZonedTimeFormats
  ++ map (prop_format_parse_format_named "UTCTime") partialUTCTimeFormats
+ ++ map (prop_format_parse_format_named "UniversalTime") partialUniversalTimeFormats
 
  ++ map (prop_no_crash_bad_input_named "Day") (dayFormats ++ partialDayFormats ++ failingPartialDayFormats)
  ++ map (prop_no_crash_bad_input_named "TimeOfDay") (timeOfDayFormats ++ partialTimeOfDayFormats)
@@ -476,6 +488,7 @@ properties =
  ++ map (prop_no_crash_bad_input_named "TimeZone") (timeZoneFormats)
  ++ map (prop_no_crash_bad_input_named "ZonedTime") (zonedTimeFormats ++ partialZonedTimeFormats)
  ++ map (prop_no_crash_bad_input_named "UTCTime") (utcTimeFormats ++ partialUTCTimeFormats)
+ ++ map (prop_no_crash_bad_input_named "UniversalTime") (universalTimeFormats ++ partialUniversalTimeFormats)
 
 
 
@@ -528,6 +541,9 @@ utcTimeFormats :: [FormatString UTCTime]
 utcTimeFormats = map FormatString
   ["%s.%q","%s%Q"]
 
+universalTimeFormats :: [FormatString UniversalTime]
+universalTimeFormats = map FormatString []
+
 --
 -- * Formats that do not include all the information
 --
@@ -562,6 +578,10 @@ partialUTCTimeFormats = map FormatString
      "%c"
     ]
 
+partialUniversalTimeFormats :: [FormatString UniversalTime]
+partialUniversalTimeFormats = map FormatString
+    [ ]
+
 
 --
 -- * Known failures



More information about the ghc-commits mailing list