thyme-0.4: A faster time library
Safe HaskellSafe-Inferred
LanguageHaskell2010

Data.Thyme.Calendar

Description

Calendar calculations.

Note that UTCTime is not Y294K-compliant, and Bounded instances for the various calendar types reflect this fact. That said, the calendar calculations by themselves work perfectly fine for a wider range of dates, subject to the size of Int for your platform.

Synopsis

Day

newtype Day Source #

A calendar-agnostic day, internally represented as a count of days since 1858-11-17, the Modified Julian Day (MJD) epoch.

To convert a Day to the corresponding YearMonthDay in the Gregorian calendar, see gregorian.

> gregorian # YearMonthDay 2016 3 1
2016-03-01

Day is an instance of AffineSpace where Diff Day = Days, so arithmetic on Day and Days can be performed with the .-., .+^, and .-^ operators.

> gregorian # YearMonthDay 2016 3 1  .-.  gregorian # YearMonthDay 2016 2 1
29
> gregorian # YearMonthDay 2016 3 1 .-^ 1
2016-02-29

Other ways of viewing a Day include ordinalDate, and weekDate.

Constructors

ModifiedJulianDay 

Instances

Instances details
Arbitrary Day Source # 
Instance details

Defined in Data.Thyme.Calendar

Methods

arbitrary :: Gen Day #

shrink :: Day -> [Day] #

CoArbitrary Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Methods

coarbitrary :: Day -> Gen b -> Gen b #

Data Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Day -> c Day #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Day #

toConstr :: Day -> Constr #

dataTypeOf :: Day -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c Day) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Day) #

gmapT :: (forall b. Data b => b -> b) -> Day -> Day #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Day -> r #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Day -> r #

gmapQ :: (forall d. Data d => d -> u) -> Day -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> Day -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> Day -> m Day #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Day -> m Day #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Day -> m Day #

Bounded Day Source # 
Instance details

Defined in Data.Thyme.Calendar

Methods

minBound :: Day #

maxBound :: Day #

Enum Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Methods

succ :: Day -> Day #

pred :: Day -> Day #

toEnum :: Int -> Day #

fromEnum :: Day -> Int #

enumFrom :: Day -> [Day] #

enumFromThen :: Day -> Day -> [Day] #

enumFromTo :: Day -> Day -> [Day] #

enumFromThenTo :: Day -> Day -> Day -> [Day] #

Generic Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Associated Types

type Rep Day :: Type -> Type #

Methods

from :: Day -> Rep Day x #

to :: Rep Day x -> Day #

Ix Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Methods

range :: (Day, Day) -> [Day] #

index :: (Day, Day) -> Day -> Int #

unsafeIndex :: (Day, Day) -> Day -> Int #

inRange :: (Day, Day) -> Day -> Bool #

rangeSize :: (Day, Day) -> Int #

unsafeRangeSize :: (Day, Day) -> Int #

Read Day Source # 
Instance details

Defined in Data.Thyme.Format

Show Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Methods

showsPrec :: Int -> Day -> ShowS #

show :: Day -> String #

showList :: [Day] -> ShowS #

NFData Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Methods

rnf :: Day -> () #

Eq Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Methods

(==) :: Day -> Day -> Bool #

(/=) :: Day -> Day -> Bool #

Ord Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Methods

compare :: Day -> Day -> Ordering #

(<) :: Day -> Day -> Bool #

(<=) :: Day -> Day -> Bool #

(>) :: Day -> Day -> Bool #

(>=) :: Day -> Day -> Bool #

max :: Day -> Day -> Day #

min :: Day -> Day -> Day #

Hashable Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Methods

hashWithSalt :: Int -> Day -> Int #

hash :: Day -> Int #

Random Day Source # 
Instance details

Defined in Data.Thyme.Calendar

Methods

randomR :: RandomGen g => (Day, Day) -> g -> (Day, g) #

random :: RandomGen g => g -> (Day, g) #

randomRs :: RandomGen g => (Day, Day) -> g -> [Day] #

randoms :: RandomGen g => g -> [Day] #

FormatTime Day Source # 
Instance details

Defined in Data.Thyme.Format

Methods

showsTime :: TimeLocale -> Day -> (Char -> ShowS) -> Char -> ShowS Source #

ParseTime Day Source # 
Instance details

Defined in Data.Thyme.Format

Unbox Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

AffineSpace Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Associated Types

type Diff Day #

Methods

(.-.) :: Day -> Day -> Diff Day #

(.+^) :: Day -> Diff Day -> Day #

Thyme Day Day Source # 
Instance details

Defined in Data.Thyme.Time.Core

Methods

thyme :: Iso' Day0 Day Source #

Vector Vector Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

MVector MVector Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

type Rep Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

type Rep Day = D1 ('MetaData "Day" "Data.Thyme.Calendar.Internal" "thyme-0.4-HyK6SfK4MlBKX4LjgMsZJ4" 'True) (C1 ('MetaCons "ModifiedJulianDay" 'PrefixI 'True) (S1 ('MetaSel ('Just "toModifiedJulianDay") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Int)))
newtype Vector Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

newtype Vector Day = V_Day (Vector Int)
type Diff Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

type Diff Day = Days
newtype MVector s Day Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

newtype MVector s Day = MV_Day (MVector s Int)

modifiedJulianDay :: Iso' Day Int Source #

Convert between a Day and the corresponding count of days from 1858-11-17, the MJD epoch.

modifiedJulianDay = iso toModifiedJulianDay ModifiedJulianDay
> modifiedJulianDay # 0
1858-11-17
> gregorian # YearMonthDay 2016 3 1 & modifiedJulianDay %~ subtract 1
2016-02-29

Calendar

type Year = Int Source #

Calendar year.

type Month = Int Source #

Calendar month. January = 1

type DayOfMonth = Int Source #

Calendar day-of-month, starting from 1.

data YearMonthDay Source #

A strict triple of a Year, a Day, and a Month.

Constructors

YearMonthDay 

Fields

Instances

Instances details
Arbitrary YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar

CoArbitrary YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar

Methods

coarbitrary :: YearMonthDay -> Gen b -> Gen b #

Data YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> YearMonthDay -> c YearMonthDay #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c YearMonthDay #

toConstr :: YearMonthDay -> Constr #

dataTypeOf :: YearMonthDay -> DataType #

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c YearMonthDay) #

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c YearMonthDay) #

gmapT :: (forall b. Data b => b -> b) -> YearMonthDay -> YearMonthDay #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> YearMonthDay -> r #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> YearMonthDay -> r #

gmapQ :: (forall d. Data d => d -> u) -> YearMonthDay -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> YearMonthDay -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> YearMonthDay -> m YearMonthDay #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> YearMonthDay -> m YearMonthDay #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> YearMonthDay -> m YearMonthDay #

Bounded YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar

Generic YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Associated Types

type Rep YearMonthDay :: Type -> Type #

Show YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

NFData YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Methods

rnf :: YearMonthDay -> () #

Eq YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Ord YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Hashable YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Random YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar

FormatTime YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Format

ParseTime YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Format

Unbox YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

Vector Vector YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

MVector MVector YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

type Rep YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

type Rep YearMonthDay = D1 ('MetaData "YearMonthDay" "Data.Thyme.Calendar.Internal" "thyme-0.4-HyK6SfK4MlBKX4LjgMsZJ4" 'False) (C1 ('MetaCons "YearMonthDay" 'PrefixI 'True) (S1 ('MetaSel ('Just "ymdYear") 'SourceUnpack 'SourceStrict 'DecidedStrict) (Rec0 Year) :*: (S1 ('MetaSel ('Just "ymdMonth") 'SourceUnpack 'SourceStrict 'DecidedStrict) (Rec0 Month) :*: S1 ('MetaSel ('Just "ymdDay") 'SourceUnpack 'SourceStrict 'DecidedStrict) (Rec0 DayOfMonth))))
newtype Vector YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

newtype MVector s YearMonthDay Source # 
Instance details

Defined in Data.Thyme.Calendar.Internal

type Years = Int Source #

A duration/count of years.

type Months = Int Source #

A duration/count of months.

type Days = Int Source #

A duration/count of days.

Gregorian calendar

Note that using the Gregorian calendar for dates before its adoption (from 1582 onwards, but varies from one country to the next) produces a proleptic calendar, which may cause some confusion.

isLeapYear :: Year -> Bool Source #

Is it a leap year according to the Gregorian calendar?

yearMonthDay :: Iso' OrdinalDate YearMonthDay Source #

Conversion between a Gregorian OrdinalDate and the corresponding YearMonthDay.

> OrdinalDate 2016 32 ^. yearMonthDay
YearMonthDay {ymdYear = 2016, ymdMonth = 2, ymdDay = 1}
> yearMonthDay # YearMonthDay 2016 2 1
OrdinalDate {odYear = 2016, odDay = 32}

gregorian :: Iso' Day YearMonthDay Source #

Conversion between a Day and its YearMonthDay.

gregorian = ordinalDate . yearMonthDay
> ModifiedJulianDay 0 ^. gregorian
YearMonthDay {ymdYear = 1858, ymdMonth = 11, ymdDay = 17}
> gregorian # YearMonthDay 1858 11 17
1858-11-17

gregorianValid :: YearMonthDay -> Maybe Day Source #

Conversion between a YearMonthDay and the corresponding Day. Returns Nothing for invalid input.

> gregorianValid (YearMonthDay 2015 2 28)
Just 2015-02-28
> gregorianValid (YearMonthDay 2015 2 29)
Nothing

showGregorian :: Day -> String Source #

Shows a Day in ISO 8601 YYYY-MM-DD format.

See Data.Thyme.Format for other possibilities.

gregorianMonthLength :: Year -> Month -> Days Source #

The number of days in a given month in the Gregorian calendar.

> gregorianMonthLength 2005 2
28

gregorianMonthsClip :: Months -> YearMonthDay -> YearMonthDay Source #

Add months, with days past the last day of the month clipped to the last day.

See also addGregorianMonthsClip.

> gregorianMonthsClip 1 $ YearMonthDay 2005 1 30
YearMonthDay {ymdYear = 2005, ymdMonth = 2, ymdDay = 28}

gregorianMonthsRollover :: Months -> YearMonthDay -> YearMonthDay Source #

Add months, with days past the last day of the month rolling over to the next month.

See also addGregorianMonthsRollover.

> gregorianMonthsRollover 1 $ YearMonthDay 2005 1 30
YearMonthDay {ymdYear = 2005, ymdMonth = 3, ymdDay = 2}

gregorianYearsClip :: Years -> YearMonthDay -> YearMonthDay Source #

Add years, matching month and day, with February 29th clipped to the 28th if necessary.

See also addGregorianYearsClip.

> gregorianYearsClip 2 $ YearMonthDay 2004 2 29
YearMonthDay {ymdYear = 2006, ymdMonth = 2, ymdDay = 28}

gregorianYearsRollover :: Years -> YearMonthDay -> YearMonthDay Source #

Add years, matching month and day, with February 29th rolled over to March 1st if necessary.

See also addGregorianYearsRollover.

> gregorianYearsRollover 2 $ YearMonthDay 2004 2 29
YearMonthDay {ymdYear = 2006, ymdMonth = 3, ymdDay = 1}

addDays :: Days -> Day -> Day Source #

Add some Days to a calendar Day to get a new Day.

addDays = flip (.+^)
addDays n d ≡ d .+^ n

See also the AffineSpace instance for Day.

diffDays :: Day -> Day -> Days Source #

Subtract two calendar Days for the difference in Days.

diffDays = (.-.)
diffDays a b = a .-. b

See also the AffineSpace instance for Day.

toGregorian :: Day -> (Year, Month, DayOfMonth) Source #

Convert a Day to its Gregorian Year, Month, and DayOfMonth.

toGregorian (view gregorian -> YearMonthDay y m d) = (y, m, d)

fromGregorian :: Year -> Month -> DayOfMonth -> Day Source #

Construct a Day from a Gregorian calendar date. Does not validate the input.

fromGregorian y m d = gregorian # YearMonthDay y m d

fromGregorianValid :: Year -> Month -> DayOfMonth -> Maybe Day Source #

Construct a Day from a Gregorian calendar date. Returns Nothing for invalid input.

fromGregorianValid y m d = gregorianValid (YearMonthDay y m d)

addGregorianMonthsClip :: Months -> Day -> Day Source #

Add some number of Months to the given Day; if the original DayOfMonth exceeds that of the new Month, it will be clipped to the last day of the new Month.

addGregorianMonthsClip n = gregorian %~ gregorianMonthsClip n

addGregorianMonthsRollover :: Months -> Day -> Day Source #

Add some number of Months to the given Day; if the original DayOfMonth exceeds that of the new Month, it will be rolled over into the following Month.

addGregorianMonthsRollover n = gregorian %~ gregorianMonthsRollover n

addGregorianYearsClip :: Years -> Day -> Day Source #

Add some number of Years to the given Day, with February 29th clipped to February 28th if necessary.

addGregorianYearsClip n = gregorian %~ gregorianYearsClip n

addGregorianYearsRollover :: Years -> Day -> Day Source #

Add some number of Years to the given Day, with February 29th rolled over to March 1st if necessary.

addGregorianYearsRollover n = gregorian %~ gregorianYearsRollover n

Orphan instances

Arbitrary Day Source # 
Instance details

Methods

arbitrary :: Gen Day #

shrink :: Day -> [Day] #

Arbitrary YearMonthDay Source # 
Instance details

CoArbitrary YearMonthDay Source # 
Instance details

Methods

coarbitrary :: YearMonthDay -> Gen b -> Gen b #

Bounded Day Source # 
Instance details

Methods

minBound :: Day #

maxBound :: Day #

Bounded YearMonthDay Source # 
Instance details

Random Day Source # 
Instance details

Methods

randomR :: RandomGen g => (Day, Day) -> g -> (Day, g) #

random :: RandomGen g => g -> (Day, g) #

randomRs :: RandomGen g => (Day, Day) -> g -> [Day] #

randoms :: RandomGen g => g -> [Day] #

Random YearMonthDay Source # 
Instance details