[commit: packages/time] master: add validating constructors (9884b31)
git at git.haskell.org
git at git.haskell.org
Fri Jan 23 22:59:37 UTC 2015
Repository : ssh://git@git.haskell.org/time
On branch : master
Link : http://git.haskell.org/packages/time.git/commitdiff/9884b31fcca197b64f6e356142d9d99e1422ab38
>---------------------------------------------------------------
commit 9884b31fcca197b64f6e356142d9d99e1422ab38
Author: Ashley Yakeley <ashley at semantic.org>
Date: Wed Jun 17 01:49:36 2009 -0700
add validating constructors
Ignore-this: e01e75f9d860f34285265b39b20cf225
darcs-hash:20090617084936-ac6dd-5ecf266acb8e2dabaa0b7a33fc2cda0cf6d44727
>---------------------------------------------------------------
9884b31fcca197b64f6e356142d9d99e1422ab38
Data/Time/Calendar/OrdinalDate.hs | 31 +++++++++++++++++++++++++++++++
Data/Time/LocalTime/TimeOfDay.hs | 9 ++++++++-
2 files changed, 39 insertions(+), 1 deletion(-)
diff --git a/Data/Time/Calendar/OrdinalDate.hs b/Data/Time/Calendar/OrdinalDate.hs
index 327c561..4e5b2b9 100644
--- a/Data/Time/Calendar/OrdinalDate.hs
+++ b/Data/Time/Calendar/OrdinalDate.hs
@@ -79,6 +79,21 @@ fromMondayStartWeek y w d = ModifiedJulianDay (firstDay + yd)
-- 0-based year day of first monday of the year
firstMonday = (5 - firstDay) `mod` 7
+fromMondayStartWeekValid :: Integer -- ^ Year.
+ -> Int -- ^ Monday-starting week number.
+ -> Int -- ^ Day of week.
+ -- Monday is 1, Sunday is 7 (as \"%u\" in 'Data.Time.Format.formatTime').
+ -> Maybe Day
+fromMondayStartWeekValid year w d = do
+ d' <- clipValid 1 7 d
+ -- first day of the year
+ let firstDay = toModifiedJulianDay (fromOrdinalDate year 1)
+ -- 0-based year day of first monday of the year
+ let firstMonday = (5 - firstDay) `mod` 7
+ let yd = firstMonday + 7 * toInteger (w-1) + toInteger d'
+ yd' <- clipValid 1 (if isLeapYear year then 366 else 365) yd
+ return (ModifiedJulianDay (firstDay - 1 + yd'))
+
-- | The inverse of 'sundayStartWeek'. Get a 'Day' given the year and
-- the number of the day of a Sunday-starting week.
-- The first Sunday is the first day of week 1, any earlier days in the
@@ -94,3 +109,19 @@ fromSundayStartWeek y w d = ModifiedJulianDay (firstDay + yd)
firstDay = toModifiedJulianDay (fromOrdinalDate y 1)
-- 0-based year day of first sunday of the year
firstSunday = (4 - firstDay) `mod` 7
+
+fromSundayStartWeekValid :: Integer -- ^ Year.
+ -> Int -- ^ Monday-starting week number.
+ -> Int -- ^ Day of week.
+ -- Monday is 1, Sunday is 7 (as \"%u\" in 'Data.Time.Format.formatTime').
+ -> Maybe Day
+fromSundayStartWeekValid year w d = do
+ d' <- clipValid 1 7 d
+ -- first day of the year
+ let firstDay = toModifiedJulianDay (fromOrdinalDate year 1)
+ -- 0-based year day of first sunday of the year
+ let firstMonday = (4 - firstDay) `mod` 7
+ let yd = firstMonday + 7 * toInteger (w-1) + toInteger d'
+ yd' <- clipValid 1 (if isLeapYear year then 366 else 365) yd
+ return (ModifiedJulianDay (firstDay - 1 + yd'))
+
diff --git a/Data/Time/LocalTime/TimeOfDay.hs b/Data/Time/LocalTime/TimeOfDay.hs
index c0b4608..9639545 100644
--- a/Data/Time/LocalTime/TimeOfDay.hs
+++ b/Data/Time/LocalTime/TimeOfDay.hs
@@ -2,7 +2,7 @@
module Data.Time.LocalTime.TimeOfDay
(
-- * Time of day
- TimeOfDay(..),midnight,midday,
+ TimeOfDay(..),midnight,midday,makeTimeOfDayValid,
utcToLocalTimeOfDay,localToUTCTimeOfDay,
timeToTimeOfDay,timeOfDayToTime,
dayFractionToTimeOfDay,timeOfDayToDayFraction
@@ -39,6 +39,13 @@ midday = TimeOfDay 12 0 0
instance Show TimeOfDay where
show (TimeOfDay h m s) = (show2 h) ++ ":" ++ (show2 m) ++ ":" ++ (show2Fixed s)
+makeTimeOfDayValid :: Int -> Int -> Pico -> Maybe TimeOfDay
+makeTimeOfDayValid h m s = do
+ clipValid 0 23 h
+ clipValid 0 59 m
+ clipValid 0 60.999999999999 s
+ return (TimeOfDay h m s)
+
-- | Convert a ToD in UTC to a ToD in some timezone, together with a day adjustment.
utcToLocalTimeOfDay :: TimeZone -> TimeOfDay -> (Integer,TimeOfDay)
utcToLocalTimeOfDay zone (TimeOfDay h m s) = (fromIntegral (div h' 24),TimeOfDay (mod h' 24) (mod m' 60) s) where
More information about the ghc-commits
mailing list