WITH Ada.Text_IO;
WITH Ada.Integer_Text_IO;
WITH Ada.Calendar;
PROCEDURE World_Time IS
------------------------------------------------------------------
--| Finds the current time in any of several time zones
--| Author: Michael B. Feldman, The George Washington University
--| Last Modified: July 1995
------------------------------------------------------------------
TYPE Cities IS (Paris, London, Rio, Caracas, DC,
Chicago, Denver, Seattle, Honolulu);
PACKAGE City_IO IS NEW Ada.Text_IO.Enumeration_IO(Cities);
TYPE TimeDiffs IS ARRAY (Cities) OF Integer;
-- table of time differences from DC; modify this table if you are
-- not located in the Eastern U.S. time zone
Offsets : CONSTANT TimeDiffs :=
(Paris => +6, London => +5, Rio => +2, Caracas => -1, DC => 0,
Chicago => -1, Denver => -2, Seattle => -3, Honolulu => -5);
TimeHere : Ada.Calendar.Time;
TimeThere : Ada.Calendar.Time;
There : Cities;
FUNCTION AdjustTime(T: Ada.Calendar.Time; City: Cities;
OffsetTable: TimeDiffs) RETURN Ada.Calendar.Time IS
-- given a time value, finds the corresponding time in a given time zone
BEGIN -- AdjustTime
RETURN Ada.Calendar."+"(T, Duration(OffsetTable(City) * 3600));
END AdjustTime;
PROCEDURE ReadCity(City : OUT Cities) IS
-- reads a city name from the terminal, robustly
BEGIN -- ReadCity
LOOP
BEGIN -- exception handler block
Ada.Text_IO.Put_Line(Item => "Please enter one of the following:");
Ada.Text_IO.Put_Line(Item =>
"Paris, London, Rio, Caracas, DC, ");
Ada.Text_IO.Put(Item =>
"Chicago, Denver, Seattle, Honolulu >");
City_IO.Get(Item => City);
EXIT; -- good input data
EXCEPTION -- bad input data
WHEN Ada.Text_IO.Data_Error =>
Ada.Text_IO.Skip_Line;
Ada.Text_IO.Put(Item => "Invalid city name; please try again.");
Ada.Text_IO.New_Line;
END; -- exception handler block
END LOOP;
END ReadCity;
PROCEDURE DisplayTime(T: Ada.Calendar.Time) IS
-- displays a Ada.Calendar.Time value in hh:mm:ss form
TYPE DayInteger IS RANGE 0..86400;
SecsPastMidnight : DayInteger; -- could be larger than 32767
MinsPastMidnight : Natural;
Secs : Natural;
Mins : Natural;
Hrs : Natural;
BEGIN -- DisplayTime
SecsPastMidnight := DayInteger(Ada.Calendar.Seconds(T));
MinsPastMidnight := Natural(SecsPastMidnight/60);
Secs := Natural(SecsPastMidnight REM 60);
Mins := MinsPastMidnight REM 60;
Hrs := MinsPastMidnight / 60;
Ada.Integer_Text_IO.Put (Item => Hrs, Width => 1);
Ada.Text_IO.Put (Item => ':');
IF Mins < 10 THEN
Ada.Text_IO.Put (Item => '0');
END IF;
Ada.Integer_Text_IO.Put (Item => Mins, Width => 1);
Ada.Text_IO.Put (Item => ':');
IF Secs < 10 THEN
Ada.Text_IO.Put (Item => '0');
END IF;
Ada.Integer_Text_IO.Put (Item => Secs, Width => 1);
END DisplayTime;
BEGIN -- World_Time
ReadCity(City => There);
TimeHere := Ada.Calendar.Clock;
TimeThere := AdjustTime(T=>TimeHere, City=>There, OffsetTable=>Offsets);
Ada.Text_IO.Put(Item => "Current local time is ");
DisplayTime(T => TimeHere);
Ada.Text_IO.New_Line;
Ada.Text_IO.Put(Item => "Current time in ");
City_IO.Put(Item => There, Width => 1);
Ada.Text_IO.Put(Item => " is ");
DisplayTime(T => TimeThere);
Ada.Text_IO.New_Line;
END World_Time;