g-catiio.adb (Image): For the case of %s...
authorHristian Kirtchev <kirtchev@adacore.com>
Tue, 14 Aug 2007 08:47:45 +0000 (10:47 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 14 Aug 2007 08:47:45 +0000 (10:47 +0200)
2007-08-14  Hristian Kirtchev  <kirtchev@adacore.com>

* g-catiio.adb (Image): For the case of %s, use Ada.Calendar.Time
values to compute the number of seconds since the Unix Epoc in order to
account for Daylight Savings Time. Perform special processing for dates
that are earlier than the Unix Epoc to obtain a negative number.

From-SVN: r127450

gcc/ada/g-catiio.adb

index f0174d5266a1a66ab8afd46bde5488582a6afd52..5286ef034d1855a17eb434d96ea0c301e2df49ed 100644 (file)
@@ -306,15 +306,33 @@ package body GNAT.Calendar.Time_IO is
 
                when 's' =>
                   declare
-                     Sec : constant Sec_Number :=
-                             Sec_Number (Julian_Day (Year, Month, Day)
-                                          - Julian_Day (1970, 1, 1)) * 86_400
-                                          + Sec_Number (Hour) * 3_600
-                                          + Sec_Number (Minute) * 60
-                                          + Sec_Number (Second);
+                     --  Compute the number of seconds using Ada.Calendar.Time
+                     --  values rather than Julian days to account for Daylight
+                     --  Savings Time.
+
+                     Neg : Boolean  := False;
+                     Sec : Duration := Date - Time_Of (1970, 1, 1, 0.0);
 
                   begin
-                     Result := Result & Image (Sec, None);
+                     --  Avoid rounding errors and perform special processing
+                     --  for dates earlier than the Unix Epoc.
+
+                     if Sec > 0.0 then
+                        Sec := Sec - 0.5;
+                     elsif Sec < 0.0 then
+                        Neg := True;
+                        Sec := abs (Sec + 0.5);
+                     end if;
+
+                     --  Prepend a minus sign to the result since Sec_Number
+                     --  cannot handle negative numbers.
+
+                     if Neg then
+                        Result :=
+                          Result & "-" & Image (Sec_Number (Sec), None);
+                     else
+                        Result := Result & Image (Sec_Number (Sec), None);
+                     end if;
                   end;
 
                --  Second (00..59)