with Calendar; package Dates is ----a package to support conversions between various means of representing dates. In particular it addresses year 2000 issues by supporting several six-digit date formats, some ranging from 1900 to 1999, and the others representing dates in the range 1950 to 2049.
-- Disclaimers and warnings: ------------------This package is not suitable for use with other than the astronomical Julian day or the Gregorian calendar. The earliest use of the Gregorian calendar was on October 15, 1582. Some nations adopted it much later. Much of the English speaking world switched in 1752, and Greece adopted the Gregorian calendar in 1923. Some nations and religions still use the Islamic, Hebrew, or Chinese calendars... The Ada type Calendar.Time and conversions to or from that type are not suitable for use outside the range January 1, 1901 to December 31, 2099. The limits were relaxed slightly in Ada 95, but conversion to or from Calendar.Time outside this range still will raise an exception. The two digit time types represent intervals from 1900 to 1999 for types with YY in the name, and 1950 to 2049 for types with RR in the name. However, no checking can be or is done within the package to ensure that the resulting dates are in the correct century. Such sanity checking is the responsibility of the user of the package. The validation functions merely check that the string represents a legal date.
-- This package assumes that times expressed in Calendar.Time format -- correspond to UTC. Thus there are no corrections for time zones, -- daylight savings time, or leap seconds. ----Conversion of Calendar.Time values with significant Seconds values to Julian days should only be done by converting both date and time. Such conversions will add or subtract 12 hours as appropriate when converting from Julian days to UTC, and are reversible.
type Julian_Date is new Integer; --------This is the astronomical Julian day, counting days since January first 4713 BC. June 1, 1996 is day 2450236. Actually since the astronomical day changes at noon, not midnight, June 1, 1996 starts as 2450236, and ends as 2450237. Arithmetic and arithmetic comparisons all work correctly, and we have 11.7 million years before we have to worry about overflow in 32-bit integers. Those with 24-bit integers can start worrying in 18250 AD or so. ;-) type Julian_Duration is new Duration range -86400.0..86400.0; -- Made a new type to avoid unintentional mixing. type Day_Name is (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday); -- exported for convenience: function Day_Of_Week(T: in Calendar.Time) return Day_Name; function Is_Leap_Year(Year: in Integer) return Boolean; -- Is this year a leap year in the Gregorian Calendar? Year 2000 is, in -- spite of some recent confusion. On the other hand 1900 and 2100 are -- not Gregorian leap years. function Julian_Day(T: in Calendar.Time) return Julian_Date; function Julian_Seconds(T: in Calendar.Time) return Julian_Duration;
procedure Split(Date: in Calendar.Time; Day: out Julian_Date; Seconds: out Julian_Duration); function Time_Of(Day: in Julian_Date; Seconds: in Julian_Duration := 0.0) return Calendar.Time; function Year(D: in Julian_Date) return Calendar.Year_Number; function Month(D: in Julian_Date) return Calendar.Month_Number; function Day(D: in Julian_Date) return Calendar.Day_Number; function Day_Of_Week(D: in Julian_Date) return Day_Name; procedure Split(Date: in Julian_Date; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); procedure Split(Date: in Julian_Date; Julian_Seconds: in Julian_Duration; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number; Seconds: out Calendar.Day_Duration); -- Four digit years type YYYYMMDD is new String(1..8); function ">"(L,R: YYYYMMDD) return Boolean; function ">="(L,R: YYYYMMDD) return Boolean; function "<"(L,R: YYYYMMDD) return Boolean; function "<="(L,R: YYYYMMDD) return Boolean; function To_Julian(Date: in YYYYMMDD) return Julian_Date; function To_YYYYMMDD(Date: in Julian_Date) return YYYYMMDD; function To_Time(Date: in YYYYMMDD; Seconds: in Duration := 0.0) return Calendar.Time; function To_YYYYMMDD(T: in Calendar.Time) return YYYYMMDD; function Year(D: in YYYYMMDD) return Calendar.Year_Number; function Month(D: in YYYYMMDD) return Calendar.Month_Number; function Day(D: in YYYYMMDD) return Calendar.Day_Number; function Day_Of_Week(D: in YYYYMMDD) return Day_Name; function Validate(D: in YYYYMMDD; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in YYYYMMDD; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); type YYYYMMMDD is new String(1..9); function ">"(L,R: YYYYMMMDD) return Boolean; function ">="(L,R: YYYYMMMDD) return Boolean; function "<"(L,R: YYYYMMMDD) return Boolean; function "<="(L,R: YYYYMMMDD) return Boolean; function To_Julian(Date: in YYYYMMMDD) return Julian_Date; function To_YYYYMMMDD(Date: in Julian_Date) return YYYYMMMDD; function To_Time(Date: in YYYYMMMDD; Seconds: in Duration := 0.0) return Calendar.Time; function To_YYYYMMMDD(T: in Calendar.Time) return YYYYMMMDD; function Year(D: in YYYYMMMDD) return Calendar.Year_Number; function Month(D: in YYYYMMMDD) return Calendar.Month_Number; function Day(D: in YYYYMMMDD) return Calendar.Day_Number; function Day_Of_Week(D: in YYYYMMMDD) return Day_Name; function Validate(D: in YYYYMMMDD; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in YYYYMMMDD; Year: out Calendar.Year_Number;
Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); type YYYYDDD is new String(1..7); function ">"(L,R: YYYYDDD) return Boolean; function ">="(L,R: YYYYDDD) return Boolean; function "<"(L,R: YYYYDDD) return Boolean; function "<="(L,R: YYYYDDD) return Boolean; function To_Julian(Date: in YYYYDDD) return Julian_Date; function To_YYYYDDD(Date: in Julian_Date) return YYYYDDD; function To_Time(Date: in YYYYDDD; Seconds: in Duration := 0.0) return Calendar.Time; function To_YYYYDDD(T: in Calendar.Time) return YYYYDDD; function Year(D: in YYYYDDD) return Calendar.Year_Number; function Month(D: in YYYYDDD) return Calendar.Month_Number; function Day(D: in YYYYDDD) return Calendar.Day_Number; function Day_Of_Week(D: in YYYYDDD) return Day_Name; function Validate(D: in YYYYDDD; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in YYYYDDD; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); -- Implict range of 1900..1999: type YYMMDD is new String(1..6); function ">"(L,R: YYMMDD) return Boolean; function ">="(L,R: YYMMDD) return Boolean; function "<"(L,R: YYMMDD) return Boolean; function "<="(L,R: YYMMDD) return Boolean; function To_Julian(Date: in YYMMDD) return Julian_Date; function To_YYMMDD(Date: in Julian_Date) return YYMMDD; function To_Time(Date: in YYMMDD; Seconds: in Duration := 0.0) return Calendar.Time; function To_YYMMDD(T: in Calendar.Time) return YYMMDD; function Year(D: in YYMMDD) return Calendar.Year_Number; function Month(D: in YYMMDD) return Calendar.Month_Number; function Day(D: in YYMMDD) return Calendar.Day_Number; function Day_Of_Week(D: in YYMMDD) return Day_Name; function Validate(D: in YYMMDD; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in YYMMDD; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); type YYMMMDD is new String(1..7); function ">"(L,R: YYMMMDD) return Boolean; function ">="(L,R: YYMMMDD) return Boolean; function "<"(L,R: YYMMMDD) return Boolean; function "<="(L,R: YYMMMDD) return Boolean; function To_Julian(Date: in YYMMMDD) return Julian_Date; function To_YYMMMDD(Date: in Julian_Date) return YYMMMDD; function To_Time(Date: in YYMMMDD; Seconds: in Duration := 0.0) return Calendar.Time; function To_YYMMMDD(T: in Calendar.Time) return YYMMMDD; function Year(D: in YYMMMDD) return Calendar.Year_Number; function Month(D: in YYMMMDD) return Calendar.Month_Number; function Day(D: in YYMMMDD) return Calendar.Day_Number; function Day_Of_Week(D: in YYMMMDD) return Day_Name; function Validate(D: in YYMMMDD; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in YYMMMDD; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number;
Day: out Calendar.Day_Number); type MMDDYY is new String(1..6); function ">"(L,R: MMDDYY) return Boolean; function ">="(L,R: MMDDYY) return Boolean; function "<"(L,R: MMDDYY) return Boolean; function "<="(L,R: MMDDYY) return Boolean; function To_Julian(Date: in MMDDYY) return Julian_Date; function To_MMDDYY(Date: in Julian_Date) return MMDDYY; function To_Time(Date: in MMDDYY; Seconds: in Duration := 0.0) return Calendar.Time; function To_MMDDYY(T: in Calendar.Time) return MMDDYY; function Year(D: in MMDDYY) return Calendar.Year_Number; function Month(D: in MMDDYY) return Calendar.Month_Number; function Day(D: in MMDDYY) return Calendar.Day_Number; function Day_Of_Week(D: in MMDDYY) return Day_Name; function Validate(D: in MMDDYY; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in MMDDYY; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); type MMMDDYY is new String(1..7); function ">"(L,R: MMMDDYY) return Boolean; function ">="(L,R: MMMDDYY) return Boolean; function "<"(L,R: MMMDDYY) return Boolean; function "<="(L,R: MMMDDYY) return Boolean; function To_Julian(Date: in MMMDDYY) return Julian_Date; function To_MMMDDYY(Date: in Julian_Date) return MMMDDYY; function To_Time(Date: in MMMDDYY; Seconds: in Duration := 0.0) return Calendar.Time; function To_MMMDDYY(T: in Calendar.Time) return MMMDDYY; function Year(D: in MMMDDYY) return Calendar.Year_Number; function Month(D: in MMMDDYY) return Calendar.Month_Number; function Day(D: in MMMDDYY) return Calendar.Day_Number; function Day_Of_Week(D: in MMMDDYY) return Day_Name; function Validate(D: in MMMDDYY; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in MMMDDYY; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); type DDMMYY is new String(1..6); function ">"(L,R: DDMMYY) return Boolean; function ">="(L,R: DDMMYY) return Boolean; function "<"(L,R: DDMMYY) return Boolean; function "<="(L,R: DDMMYY) return Boolean; function To_Julian(Date: in DDMMYY) return Julian_Date; function To_DDMMYY(Date: in Julian_Date) return DDMMYY; function To_Time(Date: in DDMMYY; Seconds: in Duration := 0.0) return Calendar.Time; function To_DDMMYY(T: in Calendar.Time) return DDMMYY; function Year(D: in DDMMYY) return Calendar.Year_Number; function Month(D: in DDMMYY) return Calendar.Month_Number; function Day(D: in DDMMYY) return Calendar.Day_Number; function Day_Of_Week(D: in DDMMYY) return Day_Name; function Validate(D: in DDMMYY; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in DDMMYY; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); type DDMMMYY is new String(1..7); function ">"(L,R: DDMMMYY) return Boolean;
function function function function function function
">="(L,R: DDMMMYY) return Boolean; "<"(L,R: DDMMMYY) return Boolean; "<="(L,R: DDMMMYY) return Boolean; To_Julian(Date: in DDMMMYY) return Julian_Date; To_DDMMMYY(Date: in Julian_Date) return DDMMMYY; To_Time(Date: in DDMMMYY; Seconds: in Duration := 0.0) return Calendar.Time; function To_DDMMMYY(T: in Calendar.Time) return DDMMMYY; function Year(D: in DDMMMYY) return Calendar.Year_Number; function Month(D: in DDMMMYY) return Calendar.Month_Number; function Day(D: in DDMMMYY) return Calendar.Day_Number; function Day_Of_Week(D: in DDMMMYY) return Day_Name; function Validate(D: in DDMMMYY; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in DDMMMYY; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); type YYDDD is new String(1..5); -- year plus day of year, sometimes also -- called Julian dates. function ">"(L,R: YYDDD) return Boolean; function ">="(L,R: YYDDD) return Boolean; function "<"(L,R: YYDDD) return Boolean; function "<="(L,R: YYDDD) return Boolean; function To_Julian(Date: in YYDDD) return Julian_Date; function To_YYDDD(Date: in Julian_Date) return YYDDD; function To_Time(Date: in YYDDD; Seconds: in Duration := 0.0) return Calendar.Time; function To_YYDDD(T: in Calendar.Time) return YYDDD; function Year(D: in YYDDD) return Calendar.Year_Number; function Month(D: in YYDDD) return Calendar.Month_Number; function Day(D: in YYDDD) return Calendar.Day_Number; function Day_Of_Week(D: in YYDDD) return Day_Name; function Validate(D: in YYDDD; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in YYDDD; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); -- Implict range of 1950..2049: type RRMMDD is new String(1..6); function ">"(L,R: RRMMDD) return Boolean; function ">="(L,R: RRMMDD) return Boolean; function "<"(L,R: RRMMDD) return Boolean; function "<="(L,R: RRMMDD) return Boolean; function To_Julian(Date: in RRMMDD) return Julian_Date; function To_RRMMDD(Date: in Julian_Date) return RRMMDD; function To_Time(Date: in RRMMDD; Seconds: in Duration := 0.0) return Calendar.Time; function To_RRMMDD(T: in Calendar.Time) return RRMMDD; function Year(D: in RRMMDD) return Calendar.Year_Number; function Month(D: in RRMMDD) return Calendar.Month_Number; function Day(D: in RRMMDD) return Calendar.Day_Number; function Day_Of_Week(D: in RRMMDD) return Day_Name; function Validate(D: in RRMMDD; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in RRMMDD; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); type RRMMMDD is new String(1..7); function ">"(L,R: RRMMMDD) return Boolean; function ">="(L,R: RRMMMDD) return Boolean;
function function function function function
"<"(L,R: RRMMMDD) return Boolean; "<="(L,R: RRMMMDD) return Boolean; To_Julian(Date: in RRMMMDD) return Julian_Date; To_RRMMMDD(Date: in Julian_Date) return RRMMMDD; To_Time(Date: in RRMMMDD; Seconds: in Duration := 0.0) return Calendar.Time; function To_RRMMMDD(T: in Calendar.Time) return RRMMMDD; function Year(D: in RRMMMDD) return Calendar.Year_Number; function Month(D: in RRMMMDD) return Calendar.Month_Number; function Day(D: in RRMMMDD) return Calendar.Day_Number; function Day_Of_Week(D: in RRMMMDD) return Day_Name; function Validate(D: in RRMMMDD; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in RRMMMDD; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); type MMDDRR is new String(1..6); function ">"(L,R: MMDDRR) return Boolean; function ">="(L,R: MMDDRR) return Boolean; function "<"(L,R: MMDDRR) return Boolean; function "<="(L,R: MMDDRR) return Boolean; function To_Julian(Date: in MMDDRR) return Julian_Date; function To_MMDDRR(Date: in Julian_Date) return MMDDRR; function To_Time(Date: in MMDDRR; Seconds: in Duration := 0.0) return Calendar.Time; function To_MMDDRR(T: in Calendar.Time) return MMDDRR; function Year(D: in MMDDRR) return Calendar.Year_Number; function Month(D: in MMDDRR) return Calendar.Month_Number; function Day(D: in MMDDRR) return Calendar.Day_Number; function Day_Of_Week(D: in MMDDRR) return Day_Name; function Validate(D: in MMDDRR; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in MMDDRR; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); type MMMDDRR is new String(1..7); function ">"(L,R: MMMDDRR) return Boolean; function ">="(L,R: MMMDDRR) return Boolean; function "<"(L,R: MMMDDRR) return Boolean; function "<="(L,R: MMMDDRR) return Boolean; function To_Julian(Date: in MMMDDRR) return Julian_Date; function To_MMMDDRR(Date: in Julian_Date) return MMMDDRR; function To_Time(Date: in MMMDDRR; Seconds: in Duration := 0.0) return Calendar.Time; function To_MMMDDRR(T: in Calendar.Time) return MMMDDRR; function Year(D: in MMMDDRR) return Calendar.Year_Number; function Month(D: in MMMDDRR) return Calendar.Month_Number; function Day(D: in MMMDDRR) return Calendar.Day_Number; function Day_Of_Week(D: in MMMDDRR) return Day_Name; function Validate(D: in MMMDDRR; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in MMMDDRR; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); type DDMMRR is new String(1..6); function ">"(L,R: DDMMRR) return Boolean; function ">="(L,R: DDMMRR) return Boolean; function "<"(L,R: DDMMRR) return Boolean; function "<="(L,R: DDMMRR) return Boolean; function To_Julian(Date: in DDMMRR) return Julian_Date; function To_DDMMRR(Date: in Julian_Date) return DDMMRR;
function To_Time(Date: in DDMMRR; Seconds: in Duration := 0.0) return Calendar.Time; function To_DDMMRR(T: in Calendar.Time) return DDMMRR; function Year(D: in DDMMRR) return Calendar.Year_Number; function Month(D: in DDMMRR) return Calendar.Month_Number; function Day(D: in DDMMRR) return Calendar.Day_Number; function Day_Of_Week(D: in DDMMRR) return Day_Name; function Validate(D: in DDMMRR; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in DDMMRR; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); type DDMMMRR is new String(1..7); function ">"(L,R: DDMMMRR) return Boolean; function ">="(L,R: DDMMMRR) return Boolean; function "<"(L,R: DDMMMRR) return Boolean; function "<="(L,R: DDMMMRR) return Boolean; function To_Julian(Date: in DDMMMRR) return Julian_Date; function To_DDMMMRR(Date: in Julian_Date) return DDMMMRR; function To_Time(Date: in DDMMMRR; Seconds: in Duration := 0.0) return Calendar.Time; function To_DDMMMRR(T: in Calendar.Time) return DDMMMRR; function Year(D: in DDMMMRR) return Calendar.Year_Number; function Month(D: in DDMMMRR) return Calendar.Month_Number; function Day(D: in DDMMMRR) return Calendar.Day_Number; function Day_Of_Week(D: in DDMMMRR) return Day_Name; function Validate(D: in DDMMMRR; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in DDMMMRR; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); type RRDDD is new String(1..5); -- year plus day of year, sometimes call -- "Julian dates." function ">"(L,R: RRDDD) return Boolean; function ">="(L,R: RRDDD) return Boolean; function "<"(L,R: RRDDD) return Boolean; function "<="(L,R: RRDDD) return Boolean; function To_Julian(Date: in RRDDD) return Julian_Date; function To_RRDDD(Date: in Julian_Date) return RRDDD; function To_Time(Date: in RRDDD; Seconds: in Duration := 0.0) return Calendar.Time; function To_RRDDD(T: in Calendar.Time) return RRDDD; function Year(D: in RRDDD) return Calendar.Year_Number; function Month(D: in RRDDD) return Calendar.Month_Number; function Day(D: in RRDDD) return Calendar.Day_Number; function Day_Of_Week(D: in RRDDD) return Day_Name; function Validate(D: in RRDDD; Allow_Blanks: Boolean := False) return Boolean; procedure Split(Date: in RRDDD; Year: out Calendar.Year_Number; Month: out Calendar.Month_Number; Day: out Calendar.Day_Number); end Dates;