hodatime
Copyright(C) 2017 Jason Johnson
LicenseBSD-style (see the file LICENSE)
MaintainerJason Johnson <jason.johnson.081@gmail.com>
Stabilityexperimental
PortabilityPOSIX, Windows
Safe HaskellSafe-Inferred
LanguageHaskell2010

Data.HodaTime.Calendar.Persian

Description

This is the module for CalendarDate and CalendarDateTime in the Persian (Solar Hijri) calendar, the official calendar of Iran and Afghanistan. It is a solar calendar whose year begins at the vernal equinox (Nowruz, around 20/21 March): the first six months (Farvardin through Shahrivar) have 31 days, the next five (Mehr through Bahman) have 30, and the final month (Esfand) has 29, or 30 in a leap year. Year 1 begins on 22.Mar.622 CE (proleptic Gregorian), the year of the Hijra; dates share the same absolute timeline as every other calendar.

Leap years: the astronomical calendar

This is the astronomical Solar Hijri calendar — the official civil calendar of Iran (equivalent to the .NET PersianCalendar from 4.6 onwards and NodaTime's PersianAstronomical). Rather than an arithmetic cycle, a year is a leap year exactly when the astronomical rule places the following Nowruz 366 days later. Nowruz is the day on which the March equinox occurs if the equinox is before true noon at the reference meridian (52.5°E, Iran Standard Time), otherwise the next day. The equinox and leap years are computed in Data.HodaTime.Calendar.Persian.Astronomical; the table is built lazily, so programs that don't use the Persian calendar pay nothing for it.

Supported range and why it is capped at 1500

The calendar is vouched for over Persian years 1 .. 1500 (≈ 622 .. 2121 CE); calendarDate rejects years outside that range. This is a deliberately narrower window than NodaTime's PersianAstronomical, which spans years 1 .. 9377 (≈ 622 .. 9999 CE). The difference is not an oversight but a consequence of how each library determines Nowruz:

  • NodaTime embeds a fixed lookup table of leap-year bits that was generated once from the .NET 4.6 BCL PersianCalendar. Every year up to 9377 therefore has a frozen, deterministic answer, even far-future years for which the "astronomical" leap flag is really just whatever value the BCL happened to precompute.
  • We instead compute each Nowruz on demand from first principles: the March equinox (Meeus, Astronomical Algorithms ch. 27/28), the equation of time (to reduce mean noon to apparent noon at the Iranian reference meridian), and ΔT — the difference between Terrestrial Time and Universal Time caused by the slow, irregular change in the Earth's rotation.

ΔT is the limiting factor. It can only be measured for the past and extrapolated for the future, and the standard Espenak–Meeus polynomials are only trustworthy through roughly 2150 CE; beyond that the extrapolation error grows without bound and can shift the computed equinox — and hence a borderline Nowruz — by a whole day. Capping at Persian year 1500 (≈ 2121 CE) keeps every result inside the range where the astronomy is genuinely well constrained, so every leap year we report is defensible rather than speculative. Over this range our results match NodaTime exactly, including all of the documented years where the astronomical calendar diverges from the arithmetic one (e.g. Persian 1404 = 21.Mar.2025, where the arithmetic calendar gives the 20th).

If you need dates past 2121 CE, prefer the arithmetic (Birashk) Solar Hijri calendar, whose leap rule is exact by definition and carries no astronomical uncertainty.

Synopsis

Constructors

calendarDate :: DayOfMonth -> Month Persian -> Year -> Maybe (CalendarDate Persian) Source #

Smart constructor for a Persian calendar date. Returns Nothing if the day is out of range for the month or the year is outside the supported range (1 .. 1500).

fromNthDay :: DayNth -> DayOfWeek Persian -> Month Persian -> Year -> Maybe (CalendarDate Persian) Source #

Smart constructor for a Persian calendar date given as a day relative to a month (e.g. the third Monday of the month). Returns Nothing if the resulting date is invalid.

fromWeekDate :: WeekNumber -> DayOfWeek Persian -> Year -> Maybe (CalendarDate Persian) Source #

Smart constructor for a Persian calendar date given as a week date. Note that this method assumes weeks start on Saturday (as in the Persian calendar) and the first week of the year is the one which has at least one day in the new year.

Types

data family Month cal Source #

Instances

Instances details
Bounded (Month Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Bounded (Month Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

Bounded (Month (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Methods

minBound :: Month (Hebrew n) #

maxBound :: Month (Hebrew n) #

Bounded (Month (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Bounded (Month Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Bounded (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Enum (Month Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Enum (Month Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

KnownNumbering n => Enum (Month (Hebrew n)) Source #

The Month Enum is the one place the numbering shows: it is calendar order rotated so counting begins at the numbering's start month (numberingStart).

Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Methods

succ :: Month (Hebrew n) -> Month (Hebrew n) #

pred :: Month (Hebrew n) -> Month (Hebrew n) #

toEnum :: Int -> Month (Hebrew n) #

fromEnum :: Month (Hebrew n) -> Int #

enumFrom :: Month (Hebrew n) -> [Month (Hebrew n)] #

enumFromThen :: Month (Hebrew n) -> Month (Hebrew n) -> [Month (Hebrew n)] #

enumFromTo :: Month (Hebrew n) -> Month (Hebrew n) -> [Month (Hebrew n)] #

enumFromThenTo :: Month (Hebrew n) -> Month (Hebrew n) -> Month (Hebrew n) -> [Month (Hebrew n)] #

Enum (Month (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Enum (Month Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Enum (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Read (Month Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Read (Month Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

Read (Month (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Read (Month (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Read (Month Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Read (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Show (Month Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Show (Month Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

Show (Month (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Methods

showsPrec :: Int -> Month (Hebrew n) -> ShowS #

show :: Month (Hebrew n) -> String #

showList :: [Month (Hebrew n)] -> ShowS #

Show (Month (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Methods

showsPrec :: Int -> Month (Islamic l) -> ShowS #

show :: Month (Islamic l) -> String #

showList :: [Month (Islamic l)] -> ShowS #

Show (Month Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Show (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

NFData (Month Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Methods

rnf :: Month Coptic -> () #

NFData (Month Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

Methods

rnf :: Month Gregorian -> () #

NFData (Month (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Methods

rnf :: Month (Hebrew n) -> () #

NFData (Month (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Methods

rnf :: Month (Islamic l) -> () #

NFData (Month Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Methods

rnf :: Month Julian -> () #

NFData (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Methods

rnf :: Month Persian -> () #

Eq (Month Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Eq (Month Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

Eq (Month (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Methods

(==) :: Month (Hebrew n) -> Month (Hebrew n) -> Bool #

(/=) :: Month (Hebrew n) -> Month (Hebrew n) -> Bool #

Eq (Month (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Methods

(==) :: Month (Islamic l) -> Month (Islamic l) -> Bool #

(/=) :: Month (Islamic l) -> Month (Islamic l) -> Bool #

Eq (Month Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Eq (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Ord (Month Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Ord (Month Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

Ord (Month (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Methods

compare :: Month (Hebrew n) -> Month (Hebrew n) -> Ordering #

(<) :: Month (Hebrew n) -> Month (Hebrew n) -> Bool #

(<=) :: Month (Hebrew n) -> Month (Hebrew n) -> Bool #

(>) :: Month (Hebrew n) -> Month (Hebrew n) -> Bool #

(>=) :: Month (Hebrew n) -> Month (Hebrew n) -> Bool #

max :: Month (Hebrew n) -> Month (Hebrew n) -> Month (Hebrew n) #

min :: Month (Hebrew n) -> Month (Hebrew n) -> Month (Hebrew n) #

Ord (Month (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Methods

compare :: Month (Islamic l) -> Month (Islamic l) -> Ordering #

(<) :: Month (Islamic l) -> Month (Islamic l) -> Bool #

(<=) :: Month (Islamic l) -> Month (Islamic l) -> Bool #

(>) :: Month (Islamic l) -> Month (Islamic l) -> Bool #

(>=) :: Month (Islamic l) -> Month (Islamic l) -> Bool #

max :: Month (Islamic l) -> Month (Islamic l) -> Month (Islamic l) #

min :: Month (Islamic l) -> Month (Islamic l) -> Month (Islamic l) #

Ord (Month Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Ord (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Hashable (Month Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Hashable (Month Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

KnownNumbering n => Hashable (Month (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Methods

hashWithSalt :: Int -> Month (Hebrew n) -> Int #

hash :: Month (Hebrew n) -> Int #

Hashable (Month (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Methods

hashWithSalt :: Int -> Month (Islamic l) -> Int #

hash :: Month (Islamic l) -> Int #

Hashable (Month Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Hashable (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

data Month Coptic Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

data Month Gregorian Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

data Month Julian Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

data Month Persian Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

data Month (Hebrew n) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

data Month (Islamic l) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

data family DayOfWeek cal Source #

Instances

Instances details
Bounded (DayOfWeek Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Bounded (DayOfWeek Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

Bounded (DayOfWeek (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Bounded (DayOfWeek (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Bounded (DayOfWeek Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Bounded (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Enum (DayOfWeek Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Enum (DayOfWeek Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

Enum (DayOfWeek (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Enum (DayOfWeek (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Enum (DayOfWeek Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Enum (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Read (DayOfWeek Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Read (DayOfWeek Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

Read (DayOfWeek (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Read (DayOfWeek (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Read (DayOfWeek Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Read (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Show (DayOfWeek Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Show (DayOfWeek Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

Show (DayOfWeek (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Show (DayOfWeek (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Show (DayOfWeek Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Show (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

NFData (DayOfWeek Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Methods

rnf :: DayOfWeek Coptic -> () #

NFData (DayOfWeek Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

Methods

rnf :: DayOfWeek Gregorian -> () #

NFData (DayOfWeek (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Methods

rnf :: DayOfWeek (Hebrew n) -> () #

NFData (DayOfWeek (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Methods

rnf :: DayOfWeek (Islamic l) -> () #

NFData (DayOfWeek Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Methods

rnf :: DayOfWeek Julian -> () #

NFData (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Methods

rnf :: DayOfWeek Persian -> () #

Eq (DayOfWeek Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Eq (DayOfWeek Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

Eq (DayOfWeek (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Methods

(==) :: DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool #

(/=) :: DayOfWeek (Hebrew n) -> DayOfWeek (Hebrew n) -> Bool #

Eq (DayOfWeek (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Eq (DayOfWeek Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Eq (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Ord (DayOfWeek Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Ord (DayOfWeek Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

Ord (DayOfWeek (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Ord (DayOfWeek (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Ord (DayOfWeek Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Ord (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Hashable (DayOfWeek Coptic) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

Hashable (DayOfWeek Gregorian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

Hashable (DayOfWeek (Hebrew n)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

Methods

hashWithSalt :: Int -> DayOfWeek (Hebrew n) -> Int #

hash :: DayOfWeek (Hebrew n) -> Int #

Hashable (DayOfWeek (Islamic l)) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

Hashable (DayOfWeek Julian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

Hashable (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

data DayOfWeek Coptic Source # 
Instance details

Defined in Data.HodaTime.Calendar.Coptic

data DayOfWeek Gregorian Source # 
Instance details

Defined in Data.HodaTime.Calendar.Gregorian.Internal

data DayOfWeek Julian Source # 
Instance details

Defined in Data.HodaTime.Calendar.Julian

data DayOfWeek Persian Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

data DayOfWeek (Hebrew n) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Hebrew

data DayOfWeek (Islamic l) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Islamic

data Persian Source #

Instances

Instances details
IsCalendar Persian Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Associated Types

data Date Persian

data DayOfWeek Persian Source #

data Month Persian Source #

Methods

fromDays :: Int32 -> Date Persian

toDays :: Date Persian -> Int32

toYmd :: Date Persian -> (Int32, Word8, Word8)

calendarName :: Date Persian -> String

day' :: Date Persian -> DayOfMonth

setDay' :: DayOfMonth -> Date Persian -> Date Persian

month' :: Date Persian -> Month Persian

setMonthIndex' :: Int -> Date Persian -> Date Persian

year' :: Date Persian -> Year

setYear' :: Year -> Date Persian -> Date Persian

dayOfWeek' :: Date Persian -> DayOfWeek Persian

next' :: Int -> DayOfWeek Persian -> Date Persian -> Date Persian

previous' :: Int -> DayOfWeek Persian -> Date Persian -> Date Persian

Bounded (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Bounded (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Enum (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Enum (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Read (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Read (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Show (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Show (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

NFData (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Methods

rnf :: DayOfWeek Persian -> () #

NFData (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Methods

rnf :: Month Persian -> () #

Eq (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Eq (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Ord (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Ord (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Hashable (DayOfWeek Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

Hashable (Month Persian) Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

data DayOfWeek Persian Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian

data Month Persian Source # 
Instance details

Defined in Data.HodaTime.Calendar.Persian