hora 2.0.2 → 2.1.0
raw patch · 22 files changed
+194/−106 lines, 22 filesdep +bytestringPVP ok
version bump matches the API change (PVP)
Dependencies added: bytestring
API changes (from Hackage documentation)
- Data.Time.Hora.Future: instance Data.Time.Hora.Future.PicoDiff Data.Time.Clock.UTC.UTCTime
- Data.Time.Hora.Stamp: instance Data.Time.Hora.Stamp.Now Data.Time.Clock.UTC.UTCTime
- Data.Time.Hora.Type: instance Data.Time.Hora.Type.Tz' Data.Time.LocalTime.TimeZone.TimeZone
+ Data.Time.Hora.Future: instance Data.Time.Hora.Future.PicoDiff Data.Time.Clock.Internal.UTCTime.UTCTime
+ Data.Time.Hora.Part: class FromUTC a
+ Data.Time.Hora.Part: instance Data.Time.Hora.Part.FromUTC Data.Time.Hora.Type.UTCTimeBin
+ Data.Time.Hora.Part: instance Data.Time.Hora.Part.ToUTC Data.Time.Hora.Type.UTCTimeBin
+ Data.Time.Hora.Part: instance GHC.Real.Integral a => Data.Time.Hora.Part.FromUTC (Data.Time.Hora.Type.DatePart a)
+ Data.Time.Hora.Stamp: instance Data.Time.Hora.Stamp.Now Data.Time.Clock.Internal.UTCTime.UTCTime
+ Data.Time.Hora.Type: UTCTimeBin :: Integer -> Integer -> UTCTimeBin
+ Data.Time.Hora.Type: [diffTimeAsPicoseconds] :: UTCTimeBin -> Integer
+ Data.Time.Hora.Type: [modifiedJulianDay] :: UTCTimeBin -> Integer
+ Data.Time.Hora.Type: data UTCTimeBin
+ Data.Time.Hora.Type: instance Data.Binary.Class.Binary Data.Time.Hora.Type.UTCTimeBin
+ Data.Time.Hora.Type: instance Data.Time.Hora.Type.Tz' Data.Time.LocalTime.Internal.TimeZone.TimeZone
+ Data.Time.Hora.Type: instance GHC.Classes.Eq Data.Time.Hora.Type.UTCTimeBin
+ Data.Time.Hora.Type: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.Time.Hora.Type.Tz a)
+ Data.Time.Hora.Type: instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.Time.Hora.Type.Tz a)
+ Data.Time.Hora.Type: instance GHC.Generics.Generic Data.Time.Hora.Type.UTCTimeBin
+ Data.Time.Hora.Type: instance GHC.Show.Show Data.Time.Hora.Type.UTCTimeBin
- Data.Time.Hora.Part: fromUtc :: Integral a => UTCTime -> DatePart a
+ Data.Time.Hora.Part: fromUtc :: FromUTC a => UTCTime -> a
Files
- changelog.md +10/−1
- hora.cabal +26/−20
- src/Data/Time/Hora/Format.hs +5/−5
- src/Data/Time/Hora/Future.hs +2/−2
- src/Data/Time/Hora/Part.hs +42/−24
- src/Data/Time/Hora/Span.hs +1/−1
- src/Data/Time/Hora/Stamp.hs +1/−2
- src/Data/Time/Hora/Type.hs +23/−3
- test/Main.hs +9/−7
- test/Test/TestConvert.hs +3/−3
- test/Test/TestDatePart.hs +4/−3
- test/Test/TestDiffTime.hs +4/−4
- test/Test/TestDmyHm.hs +1/−1
- test/Test/TestFormat.hs +3/−3
- test/Test/TestFuture.hs +3/−4
- test/Test/TestPico.hs +6/−6
- test/Test/TestPico2.hs +2/−2
- test/Test/TestSome.hs +2/−2
- test/Test/TestTime.hs +3/−3
- test/Test/TestUTCTimeBin.hs +30/−0
- test/Test/TestUtc.hs +1/−2
- test/Test/TestZone.hs +13/−8
changelog.md view
@@ -1,3 +1,13 @@+##### 2.1.0+ add serializeable UTCTimeBin: close copy of UTCTime. + + UTCTime and UTCTimeBin are easily convertible without loss of precision. ++ fromUTC is now a class function. It may be necessary to specify the result type. ++##### 2.0.3+ Tz derive Eq, Ord+ ##### 2.0.2 changes to Data.Time.Hora.Zone: @@ -48,4 +58,3 @@ ##### 1.0 initial version-
hora.cabal view
@@ -1,10 +1,10 @@ name: hora-version: 2.0.2+version: 2.1.0 build-type: Simple cabal-version: >=1.10 synopsis: date time-description: pico precision * timestamps * timezones * format+description: convenient type, timestamp, timezone, format author: Imants Cekusins maintainer: Imants Cekusins category: System, Time@@ -31,9 +31,7 @@ Data.Time.Hora.Type Data.Time.Hora.Zone Data.Time.Hora.Some- - other-modules:- + ghc-options: -fwarn-unused-imports build-depends: base >=4.7 && <5.0,@@ -83,24 +81,32 @@ main-is: Main.hs other-modules:- Test.TestConvert- Test.TestDiffTime- Test.TestFuture- Test.TestTime- Test.TestDmyHm- Test.TestPico- Test.TestPico2- Test.TestDatePart- Test.TestUtc- Test.TestZone- Test.TestSome- Test.TestFormat--+ Data.Time.Hora.Format+ Data.Time.Hora.Future+ Data.Time.Hora.Part+ Data.Time.Hora.Some+ Data.Time.Hora.Span+ Data.Time.Hora.Stamp+ Data.Time.Hora.Type+ Data.Time.Hora.Zone+ Test.TestConvert+ Test.TestDiffTime+ Test.TestFuture+ Test.TestTime+ Test.TestDmyHm+ Test.TestPico+ Test.TestPico2+ Test.TestDatePart+ Test.TestUtc+ Test.TestZone+ Test.TestSome+ Test.TestFormat+ Test.TestUTCTimeBin build-depends: base >= 4.8, hspec >= 2.1.7, QuickCheck >= 2.8.1, time, timezone-series, timezone-olson,- binary + binary,+ bytestring
src/Data/Time/Hora/Format.hs view
@@ -5,11 +5,11 @@ format, format') where -import Data.Time.Format (formatTime,defaultTimeLocale,FormatTime(..))+import Data.String import Data.Time.Clock-import Data.Time.LocalTime as L+import Data.Time.Format (formatTime,defaultTimeLocale,FormatTime(..)) import Data.Time.Hora.Type-import Data.String+import Data.Time.LocalTime as L -- | format as UTC@@ -70,8 +70,8 @@ | D_wk_0_6 -- ^ day of week number, 0 (= Sunday) - 6 (= Saturday) | D_wk -- ^ day of week short | D_week -- ^ day of week long - | Wk_year_Sun -- ^ week of year start sunday - | Wk_year_Mon -- ^ week of year start sunday+ | Wk_year_Sun -- ^ week of year start Sunday + | Wk_year_Mon -- ^ week of year start Monday
src/Data/Time/Hora/Future.hs view
@@ -1,10 +1,10 @@ module Data.Time.Hora.Future where +import Data.Fixed import Data.Time.Clock-import Data.Time.Hora.Type import Data.Time.Hora.Span+import Data.Time.Hora.Type import Prelude as P-import Data.Fixed {- | 'getCurrentTime' +/- offset
src/Data/Time/Hora/Part.hs view
@@ -1,36 +1,50 @@--- | convert between 'UTCTime' and 'DatePart'+-- | convert between 'UTCTime', 'UTCTimeBin' and 'DatePart' module Data.Time.Hora.Part - (fromUtc,fromUtc',+ (-- * FromUTC+ FromUTC(..),+ fromUtc',+ -- * ToUTC ToUTC(..)) where -import Data.Time.Hora.Type-import Data.Time.Hora.Span-import Data.Time.Clock+import Data.Fixed import Data.Time.Calendar+import Data.Time.Clock+import Data.Time.Hora.Span+import Data.Time.Hora.Type import Data.Time.LocalTime as L-import Data.Fixed -{- | UTC -}-fromUtc::Integral a => UTCTime -> DatePart a-fromUtc t0 = - let day1 = utctDay t0::Day- dt1 = utctDayTime t0::DiffTime- (y1,m1,d1) = toGregorian day1- tod1 = timeToTimeOfDay dt1::TimeOfDay- pico4 = todSec tod1::Fixed E12- (sec5, MkFixed pico5) = properFraction pico4- in DatePart {- year = fi y1,- month = fi m1,- day = fi d1,- hour = fi $ todHour tod1,- minute = fi $ todMin tod1,- second = fi sec5,- pico = fi pico5- }+class FromUTC a where+ fromUtc::UTCTime -> a +-- | returns DatePart a in UTC timezone+instance Integral a => FromUTC (DatePart a) where+ fromUtc::Integral a => UTCTime -> DatePart a+ fromUtc t0 =+ let day1 = utctDay t0::Day+ dt1 = utctDayTime t0::DiffTime+ (y1,m1,d1) = toGregorian day1+ tod1 = timeToTimeOfDay dt1::TimeOfDay+ pico4 = todSec tod1::Fixed E12+ (sec5, MkFixed pico5) = properFraction pico4+ in DatePart {+ year = fi y1,+ month = fi m1,+ day = fi d1,+ hour = fi $ todHour tod1,+ minute = fi $ todMin tod1,+ second = fi sec5,+ pico = fi pico5+ } ++instance FromUTC UTCTimeBin where+ fromUtc::UTCTime -> UTCTimeBin+ fromUtc t0 = UTCTimeBin day1 pico1+ where day1 = toModifiedJulianDay $ utctDay t0+ pico1 = diffTimeToPicoseconds $ utctDayTime t0++ {- | specified time zone Tz (DatePart a) parts show local date & time @@ -93,6 +107,10 @@ zt1 = ZonedTime lt1 tz0 in Just $ zonedTimeToUTC zt1 +instance ToUTC UTCTimeBin where+ toUtc (UTCTimeBin day0 pico0) = Just $ UTCTime day1 diff1+ where day1 = ModifiedJulianDay day0+ diff1 = picosecondsToDiffTime pico0 fi::TwoInt a b => a -> b fi = fromIntegral
src/Data/Time/Hora/Span.hs view
@@ -15,10 +15,10 @@ nominalDiff ) where +import Data.Fixed import Data.Ratio import Data.Time.Clock import Data.Time.Hora.Type-import Data.Fixed -- | pico in 1 second
src/Data/Time/Hora/Stamp.hs view
@@ -7,8 +7,8 @@ import Data.Time.Clock import Data.Time.Hora.Format-import Data.Time.Hora.Type import Data.Time.Hora.Part+import Data.Time.Hora.Type import Data.Time.LocalTime as L @@ -74,4 +74,3 @@ -- | timestamp in specified format, 'TimeZone' | 'TimeZoneSeries' ts'::Tz' tz => [Format] -> tz -> IO (Tz String) ts' lf0 tz0 = withUTCTime $ format' lf0 tz0 -
src/Data/Time/Hora/Type.hs view
@@ -1,6 +1,8 @@ module Data.Time.Hora.Type (-- * DatePart DatePart(..),+ -- * UTCTimeBin+ UTCTimeBin(..), -- * Tz Tz(..), Tz'(..),@@ -8,12 +10,11 @@ TimeSpan(..), TwoInt(..)) where --import GHC.Generics import Data.Binary import Data.Time.Clock import Data.Time.LocalTime import Data.Time.LocalTime.TimeZone.Series+import GHC.Generics {- | serializeable structure for essential Date, Time parts@@ -29,7 +30,7 @@ minute::a, second::a, pico::a -- ^ excludes seconds. Just fraction as Num - } deriving (Show, Eq, Generic)+ } deriving (Show, Generic) instance Functor DatePart where@@ -54,6 +55,7 @@ instance Binary (DatePart String) -- ^ serializeable +deriving instance Eq a => Eq (DatePart a) instance Ord a => Ord (DatePart a) where (<=) a0 b0 =@@ -76,13 +78,31 @@ (Stop b2) -> b2 +-- private data Ord_ = Stop Bool | Continue +{- | 'UTCTimeBin' closely mimicks UTCTime. +'UTCTimeBin' has 'Binary' instance. The only purpose of 'UTCTimeBin' is to offer faster conversion and more compact serialization of 'UTCTime' compared with 'DatePart'.++see "Data.Time.Hora.Part" for conversion between 'UTCTime' and 'UTCTimeBin' -}+data UTCTimeBin = UTCTimeBin {+ modifiedJulianDay::Integer, -- ^ The Modified Julian Day is a standard count of days, with zero being the day 1858-11-17+ diffTimeAsPicoseconds::Integer -- ^ 'DiffTime' expressed as picoseconds+ }+ deriving (Eq, Show, Generic)++instance Binary UTCTimeBin+-- ^ serializeable++ {-| 'Tz' ('DatePart' a) parts show local date & time for conversions between timezones see "Data.Time.Hora.Zone" -} data Tz a = Tz TimeZone a deriving (Show,Functor)++deriving instance Eq a => Eq (Tz a) +deriving instance Ord a => Ord (Tz a) -- | 'TimeZone' | 'TimeZoneSeries'
test/Main.hs view
@@ -1,17 +1,18 @@ module Main where -import qualified Test.TestDiffTime as T import qualified Test.TestConvert as Conv+import qualified Test.TestDiffTime as T+import qualified Test.TestDmyHm as D+import qualified Test.TestDatePart as Dp+import qualified Test.TestUtc as U import qualified Test.TestFuture as Fut-import qualified Test.TestTime as Tt import qualified Test.TestPico as P import qualified Test.TestPico2 as P2-import qualified Test.TestDmyHm as D -import qualified Test.TestDatePart as Dp -import qualified Test.TestUtc as U-import qualified Test.TestZone as Z-import qualified Test.TestSome as Tcom +import qualified Test.TestSome as Tcom import qualified Test.TestFormat as Tf+import qualified Test.TestTime as Tt+import qualified Test.TestUTCTimeBin as Bin+import qualified Test.TestZone as Z main::IO()@@ -28,3 +29,4 @@ Z.main Tcom.main Tf.main+ Bin.main
test/Test/TestConvert.hs view
@@ -1,9 +1,9 @@ module Test.TestConvert where -import Test.Hspec-import Data.Time.Hora.Type-import Data.Time.Hora.Span import Data.Time.Clock+import Data.Time.Hora.Span+import Data.Time.Hora.Type+import Test.Hspec main::IO()
test/Test/TestDatePart.hs view
@@ -1,9 +1,10 @@ module Test.TestDatePart where -import Test.Hspec-import Prelude hiding (until) import Data.Time.Hora.Type-default (Int) +import Prelude hiding (until)+import Test.Hspec++default (Int) main::IO()
test/Test/TestDiffTime.hs view
@@ -1,12 +1,12 @@ module Test.TestDiffTime where -import Test.Hspec-import Debug.Trace-import Data.Time.Clock import Control.Concurrent-import Data.Time.Hora.Stamp+import Data.Time.Clock import Data.Time.Hora.Future as F+import Data.Time.Hora.Stamp import Data.Time.Hora.Type+import Debug.Trace+import Test.Hspec
test/Test/TestDmyHm.hs view
@@ -1,7 +1,7 @@ module Test.TestDmyHm where -import Test.Hspec import Data.Time.Hora.Type+import Test.Hspec main::IO()
test/Test/TestFormat.hs view
@@ -1,10 +1,10 @@ module Test.TestFormat where -import Test.Hspec-import Debug.Trace-import Data.Time.Hora.Stamp import Data.Time.Hora.Format+import Data.Time.Hora.Stamp import Data.Time.Hora.Type+import Debug.Trace+import Test.Hspec main::IO()
test/Test/TestFuture.hs view
@@ -1,11 +1,10 @@ module Test.TestFuture where -import Test.Hspec-import Debug.Trace+import Data.Time.Clock import Data.Time.Hora.Future import Data.Time.Hora.Type-import Data.Time.Clock-+import Debug.Trace+import Test.Hspec main::IO()
test/Test/TestPico.hs view
@@ -1,15 +1,16 @@ module Test.TestPico where -import Test.Hspec-import Debug.Trace-import Data.Time.Hora.Part-import Data.Time.Hora.Future as F import Data.Time.Clock+import Data.Time.Hora.Future as F+import Data.Time.Hora.Part+import Data.Time.Hora.Stamp import Data.Time.Hora.Type import Data.Time.LocalTime-import Data.Time.Hora.Stamp+import Debug.Trace import Prelude as P+import Test.Hspec + main::IO() main = hspec $ do describe "Test.TestPico" $ do@@ -36,4 +37,3 @@ diff1 = t2 F.- t1 diff2 = pico d2 P.- (pico d1) diff1 `shouldBe` (Pico diff2)-
test/Test/TestPico2.hs view
@@ -1,8 +1,8 @@ module Test.TestPico2 where -import Test.Hspec-import Debug.Trace import Data.Fixed+import Debug.Trace+import Test.Hspec main::IO()
test/Test/TestSome.hs view
@@ -1,10 +1,10 @@ module Test.TestSome where -import Test.Hspec-import Debug.Trace import Data.Time.Hora.Some import Data.Time.Hora.Stamp import Data.Time.Hora.Type+import Debug.Trace+import Test.Hspec main::IO()
test/Test/TestTime.hs view
@@ -1,10 +1,10 @@ {-# LANGUAGE NoOverloadedStrings #-} module Test.TestTime where -import Test.Hspec-import Debug.Trace-import Data.Time.Hora.Stamp import Data.Time.Hora.Some+import Data.Time.Hora.Stamp+import Debug.Trace+import Test.Hspec main::IO()
+ test/Test/TestUTCTimeBin.hs view
@@ -0,0 +1,30 @@+module Test.TestUTCTimeBin where++import Data.Binary+import Data.ByteString.Lazy+import Data.Maybe+import Data.Time.Hora.Part+import Data.Time.Hora.Stamp+import Data.Time.Hora.Type+import Debug.Trace+import Test.Hspec+++main::IO()+main = hspec $ do+ describe "round trip convert & serialize UTCTime via UTCTimeBin" $ do+ it "round trip convert" $ do+ utc1 <- now+ let utcbin2 = fromUtc utc1::UTCTimeBin+ utc2 = fromJust $ toUtc utcbin2+ traceIO $ show utc1+ traceIO $ show utcbin2+ traceIO $ show utc2+ utc2 `shouldBe` utc1+ it "round trip convert & serialize" $ do+ utc10 <- now+ let utcbin10 = fromUtc utc10::UTCTimeBin+ bin11 = encode utcbin10::ByteString+ utcbin12 = decode bin11::UTCTimeBin+ utc13 = fromJust $ toUtc utcbin12+ utc10 `shouldBe` utc13
test/Test/TestUtc.hs view
@@ -16,7 +16,7 @@ `shouldBe` Nothing it "round trip" $ do now1 <- getCurrentTime- let dp1 = fromUtc now1+ let dp1 = fromUtc now1::DatePart Int Just now2 = toUtc $ traceShow dp1 dp1 now1 `shouldBe` now2 it "round trip local" $ do@@ -25,4 +25,3 @@ let dp1 = fromUtc' z1 now1::Tz (DatePart Int) Just now2 = toUtc $ traceShow dp1 dp1 now1 `shouldBe` now2-
test/Test/TestZone.hs view
@@ -1,13 +1,14 @@ module Test.TestZone where -import Test.Hspec-import Debug.Trace import Data.Time.Clock-import Data.Time.LocalTime.TimeZone.Olson-import Data.Time.LocalTime.TimeZone.Series+import Data.Time.Hora.Part import Data.Time.Hora.Stamp import Data.Time.Hora.Type-import Data.Time.Hora.Part+import Data.Time.Hora.Zone+import Data.Time.LocalTime.TimeZone.Olson+import Data.Time.LocalTime.TimeZone.Series+import Debug.Trace+import Test.Hspec main::IO()@@ -18,9 +19,13 @@ china1 <- getTimeZoneSeriesFromOlsonFile "./test/TimeSeriesData/ROC" now1 <- now::IO UTCTime traceIO $ "UTC: " ++ (show now1)- traceIO $ "Chile: " ++ (show $ ttz chile1 now1)- traceIO $ "China: " ++ (show $ ttz china1 now1)- 1 `shouldBe` 1+ let chile2 = ttz chile1 now1+ china2 = ttz china1 now1+ china3 = toTimeZone china1 chile2+ traceIO $ "Chile: " ++ (show chile2)+ traceIO $ "China: " ++ (show china1)+ traceIO $ "China converted: " ++ (show china3)+ Just china2 `shouldBe` china3 ttz::TimeZoneSeries -> UTCTime -> Tz (DatePart Int)