1------------------------------------------------------------------------------
2--                                                                          --
3--                         GNAT RUN-TIME COMPONENTS                         --
4--                                                                          --
5--              A D A . C A L E N D A R . F O R M A T T I N G               --
6--                                                                          --
7--                                 S p e c                                  --
8--                                                                          --
9--         Copyright (C) 2005-2018, Free Software Foundation, Inc.          --
10--                                                                          --
11-- This specification is derived from the Ada Reference Manual for use with --
12-- GNAT.  In accordance with the copyright of that document, you can freely --
13-- copy and modify this specification,  provided that if you redistribute a --
14-- modified version,  any changes that you have made are clearly indicated. --
15--                                                                          --
16------------------------------------------------------------------------------
17
18--  This package provides additional components to Time, as well as new
19--  Time_Of and Split routines which handle time zones and leap seconds.
20--  This package is defined in the Ada 2005 RM (9.6.1).
21
22with Ada.Calendar.Time_Zones;
23
24package Ada.Calendar.Formatting is
25
26   --  Day of the week
27
28   type Day_Name is
29     (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
30
31   function Day_Of_Week (Date : Time) return Day_Name;
32
33   --  Hours:Minutes:Seconds access
34
35   subtype Hour_Number     is Natural range 0 .. 23;
36   subtype Minute_Number   is Natural range 0 .. 59;
37   subtype Second_Number   is Natural range 0 .. 59;
38   subtype Second_Duration is Day_Duration range 0.0 .. 1.0;
39
40   function Year
41     (Date      : Time;
42      Time_Zone : Time_Zones.Time_Offset := 0) return Year_Number;
43
44   function Month
45     (Date      : Time;
46      Time_Zone : Time_Zones.Time_Offset := 0) return Month_Number;
47
48   function Day
49     (Date      : Time;
50      Time_Zone : Time_Zones.Time_Offset := 0) return Day_Number;
51
52   function Hour
53     (Date      : Time;
54      Time_Zone : Time_Zones.Time_Offset := 0) return Hour_Number;
55
56   function Minute
57     (Date      : Time;
58      Time_Zone : Time_Zones.Time_Offset := 0) return Minute_Number;
59
60   function Second
61     (Date : Time)                             return Second_Number;
62
63   function Sub_Second
64     (Date : Time)                             return Second_Duration;
65
66   function Seconds_Of
67     (Hour       : Hour_Number;
68      Minute     : Minute_Number;
69      Second     : Second_Number := 0;
70      Sub_Second : Second_Duration := 0.0) return Day_Duration;
71   --  Returns a Day_Duration value for the combination of the given Hour,
72   --  Minute, Second, and Sub_Second. This value can be used in Ada.Calendar.
73   --  Time_Of as well as the argument to Calendar."+" and Calendar."-". If
74   --  Seconds_Of is called with a Sub_Second value of 1.0, the value returned
75   --  is equal to the value of Seconds_Of for the next second with a Sub_
76   --  Second value of 0.0.
77
78   procedure Split
79     (Seconds    : Day_Duration;
80      Hour       : out Hour_Number;
81      Minute     : out Minute_Number;
82      Second     : out Second_Number;
83      Sub_Second : out Second_Duration);
84   --  Splits Seconds into Hour, Minute, Second and Sub_Second in such a way
85   --  that the resulting values all belong to their respective subtypes. The
86   --  value returned in the Sub_Second parameter is always less than 1.0.
87
88   procedure Split
89     (Date       : Time;
90      Year       : out Year_Number;
91      Month      : out Month_Number;
92      Day        : out Day_Number;
93      Hour       : out Hour_Number;
94      Minute     : out Minute_Number;
95      Second     : out Second_Number;
96      Sub_Second : out Second_Duration;
97      Time_Zone  : Time_Zones.Time_Offset := 0);
98   --  Splits Date into its constituent parts (Year, Month, Day, Hour, Minute,
99   --  Second, Sub_Second), relative to the specified time zone offset. The
100   --  value returned in the Sub_Second parameter is always less than 1.0.
101
102   function Time_Of
103     (Year        : Year_Number;
104      Month       : Month_Number;
105      Day         : Day_Number;
106      Hour        : Hour_Number;
107      Minute      : Minute_Number;
108      Second      : Second_Number;
109      Sub_Second  : Second_Duration := 0.0;
110      Leap_Second : Boolean := False;
111      Time_Zone   : Time_Zones.Time_Offset := 0) return Time;
112   --  If Leap_Second is False, returns a Time built from the date and time
113   --  values, relative to the specified time zone offset. If Leap_Second is
114   --  True, returns the Time that represents the time within the leap second
115   --  that is one second later than the time specified by the parameters.
116   --  Time_Error is raised if the parameters do not form a proper date or
117   --  time. If Time_Of is called with a Sub_Second value of 1.0, the value
118   --  returned is equal to the value of Time_Of for the next second with a
119   --  Sub_Second value of 0.0.
120
121   function Time_Of
122     (Year        : Year_Number;
123      Month       : Month_Number;
124      Day         : Day_Number;
125      Seconds     : Day_Duration := 0.0;
126      Leap_Second : Boolean := False;
127      Time_Zone   : Time_Zones.Time_Offset := 0) return Time;
128   --  If Leap_Second is False, returns a Time built from the date and time
129   --  values, relative to the specified time zone offset. If Leap_Second is
130   --  True, returns the Time that represents the time within the leap second
131   --  that is one second later than the time specified by the parameters.
132   --  Time_Error is raised if the parameters do not form a proper date or
133   --  time. If Time_Of is called with a Seconds value of 86_400.0, the value
134   --  returned is equal to the value of Time_Of for the next day with a
135   --  Seconds value of 0.0.
136
137   procedure Split
138     (Date        : Time;
139      Year        : out Year_Number;
140      Month       : out Month_Number;
141      Day         : out Day_Number;
142      Hour        : out Hour_Number;
143      Minute      : out Minute_Number;
144      Second      : out Second_Number;
145      Sub_Second  : out Second_Duration;
146      Leap_Second : out Boolean;
147      Time_Zone   : Time_Zones.Time_Offset := 0);
148   --  If Date does not represent a time within a leap second, splits Date
149   --  into its constituent parts (Year, Month, Day, Hour, Minute, Second,
150   --  Sub_Second), relative to the specified time zone offset, and sets
151   --  Leap_Second to False. If Date represents a time within a leap second,
152   --  set the constituent parts to values corresponding to a time one second
153   --  earlier than that given by Date, relative to the specified time zone
154   --  offset, and sets Leap_Seconds to True. The value returned in the
155   --  Sub_Second parameter is always less than 1.0.
156
157   procedure Split
158     (Date        : Time;
159      Year        : out Year_Number;
160      Month       : out Month_Number;
161      Day         : out Day_Number;
162      Seconds     : out Day_Duration;
163      Leap_Second : out Boolean;
164      Time_Zone   : Time_Zones.Time_Offset := 0);
165   --  If Date does not represent a time within a leap second, splits Date
166   --  into its constituent parts (Year, Month, Day, Seconds), relative to the
167   --  specified time zone offset, and sets Leap_Second to False. If Date
168   --  represents a time within a leap second, set the constituent parts to
169   --  values corresponding to a time one second earlier than that given by
170   --  Date, relative to the specified time zone offset, and sets Leap_Seconds
171   --  to True. The value returned in the Seconds parameter is always less
172   --  than 86_400.0.
173
174   --  Simple image and value
175
176   function Image
177     (Date                  : Time;
178      Include_Time_Fraction : Boolean := False;
179      Time_Zone             : Time_Zones.Time_Offset := 0) return String;
180   --  Returns a string form of the Date relative to the given Time_Zone. The
181   --  format is "Year-Month-Day Hour:Minute:Second", where the Year is a
182   --  4-digit value, and all others are 2-digit values, of the functions
183   --  defined in Ada.Calendar and Ada.Calendar.Formatting, including a
184   --  leading zero, if needed. The separators between the values are a minus,
185   --  another minus, a colon, and a single space between the Day and Hour. If
186   --  Include_Time_Fraction is True, the integer part of Sub_Seconds*100 is
187   --  suffixed to the string as a point followed by a 2-digit value.
188
189   function Value
190     (Date       : String;
191      Time_Zone  : Time_Zones.Time_Offset := 0) return Time;
192   --  Returns a Time value for the image given as Date, relative to the given
193   --  time zone. Constraint_Error is raised if the string is not formatted as
194   --  described for Image, or the function cannot interpret the given string
195   --  as a Time value.
196
197   function Image
198     (Elapsed_Time          : Duration;
199      Include_Time_Fraction : Boolean := False) return String;
200   --  Returns a string form of the Elapsed_Time. The format is "Hour:Minute:
201   --  Second", where all values are 2-digit values, including a leading zero,
202   --  if needed. The separators between the values are colons. If Include_
203   --  Time_Fraction is True, the integer part of Sub_Seconds*100 is suffixed
204   --  to the string as a point followed by a 2-digit value. If Elapsed_Time <
205   --  0.0, the result is Image (abs Elapsed_Time, Include_Time_Fraction)
206   --  prefixed with a minus sign. If abs Elapsed_Time represents 100 hours or
207   --  more, the result is implementation-defined.
208
209   function Value (Elapsed_Time : String) return Duration;
210   --  Returns a Duration value for the image given as Elapsed_Time.
211   --  Constraint_Error is raised if the string is not formatted as described
212   --  for Image, or the function cannot interpret the given string as a
213   --  Duration value.
214
215end Ada.Calendar.Formatting;
216