93 lines
3.1 KiB
Plaintext
93 lines
3.1 KiB
Plaintext
|
DEFINITION MODULE Calendar;
|
|||
|
|
|||
|
(*
|
|||
|
This module defines a Date type and operations on dates of
|
|||
|
the Gregorian Calendar, introduced in 1582
|
|||
|
*)
|
|||
|
|
|||
|
FROM DurationOps IMPORT
|
|||
|
Duration, Unit, UnitSet;
|
|||
|
|
|||
|
FROM TimeDate IMPORT
|
|||
|
Time;
|
|||
|
|
|||
|
TYPE Date =
|
|||
|
RECORD
|
|||
|
year : CARDINAL;
|
|||
|
month : [1 .. 12];
|
|||
|
day : [1 .. 31];
|
|||
|
hour : [0 .. 23];
|
|||
|
minute : [0 .. 59];
|
|||
|
second : [0 .. 59];
|
|||
|
thousandth: [0 .. 999];
|
|||
|
END; (* Date *)
|
|||
|
|
|||
|
|
|||
|
PROCEDURE GetMachineDate (VAR date: Date);
|
|||
|
(* Gets the machine date *)
|
|||
|
|
|||
|
PROCEDURE SetMachineDate (date : Date);
|
|||
|
(* Sets the machine date *)
|
|||
|
|
|||
|
|
|||
|
PROCEDURE TimeToDate (time : Time;
|
|||
|
VAR date : Date);
|
|||
|
(* Type conversion from Time (in TimeDate) to Date (in Calendar) *)
|
|||
|
|
|||
|
PROCEDURE DateToTime (date : Date;
|
|||
|
VAR time : Time);
|
|||
|
(* Type conversion from Date (in Calendar) to Time (in TimeDate) *)
|
|||
|
|
|||
|
|
|||
|
PROCEDURE IsValid (date : Date): BOOLEAN;
|
|||
|
(* Returns TRUE if date is valid, according to the Gregorian calendar *)
|
|||
|
|
|||
|
PROCEDURE DaysIn (month : CARDINAL;
|
|||
|
year : CARDINAL): CARDINAL;
|
|||
|
(* Returns the number of days in the month of the year, according to
|
|||
|
the Gregorian calendar, 0 if month is out of range. *)
|
|||
|
|
|||
|
PROCEDURE LeapYear (year : CARDINAL): BOOLEAN;
|
|||
|
(* Returns TRUE if year is a leap year, according to the Gregorian
|
|||
|
calendar (year number divisible by 400 or by 4 and not by 100) *)
|
|||
|
|
|||
|
|
|||
|
PROCEDURE SameDate (date1, date2 : Date;
|
|||
|
precision : Unit) : BOOLEAN;
|
|||
|
(* Returns TRUE if date1 and date2 are the same date, within precision *)
|
|||
|
|
|||
|
PROCEDURE Later (date1, date2 : Date;
|
|||
|
precision : Unit) : BOOLEAN;
|
|||
|
(* Returns TRUE if date1 comes after date1, within precision *)
|
|||
|
|
|||
|
PROCEDURE LaterOrSameDate (date1, date2 : Date;
|
|||
|
precision : Unit) : BOOLEAN;
|
|||
|
(* Returns TRUE if date2 is after date1 or if date1 and date2 are the same
|
|||
|
date, within precision *)
|
|||
|
|
|||
|
|
|||
|
(* The following operations give good results only with dates following
|
|||
|
October 15, 1582; when the Gregorian Calendar was first used.
|
|||
|
|
|||
|
Accuracy to the second over long periods cannot be achieved, due to
|
|||
|
fluctuations in the Earth rotation that often cause annual corrections
|
|||
|
of one second. *)
|
|||
|
|
|||
|
PROCEDURE AddToDate (date : Date;
|
|||
|
duration : Duration;
|
|||
|
VAR resultDate : Date);
|
|||
|
(* Add a duration to a date, gives a new date *)
|
|||
|
|
|||
|
PROCEDURE SubToDate (date : Date;
|
|||
|
duration : Duration;
|
|||
|
VAR resultDate : Date);
|
|||
|
(* Subtract a duration from a date, gives a new date *)
|
|||
|
|
|||
|
PROCEDURE DeltaDate (date1, date2 : Date;
|
|||
|
unitFormat : UnitSet;
|
|||
|
VAR duration : Duration);
|
|||
|
(* Absolute value of the difference between two dates, given a duration
|
|||
|
with units in unitFormat (see module Duration) *)
|
|||
|
|
|||
|
END Calendar.
|
|||
|
|