This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH 4/4] Support TZ transition times < 00:00:00.
- From: Paul Eggert <eggert at cs dot ucla dot edu>
- To: GNU C Library development <libc-alpha at sourceware dot org>
- Date: Wed, 18 Sep 2013 14:37:59 -0700
- Subject: [PATCH 4/4] Support TZ transition times < 00:00:00.
- Authentication-results: sourceware.org; auth=none
- References: <523A1BCD dot 5090609 at cs dot ucla dot edu>
This is needed for version-3 tz-format files; it supports time
stamps past 2037 for America/Godthab (the only entry in the tz
database for which this change is relevant).
* manual/time.texi (TZ Variable): Document transition times
from -167:59:59 through -00:00:01.
* time/tzset.c (tz_rule): Time of day is now signed.
(__tzset_parse_tz): Parse negative time of day.
---
ChangeLog | 9 +++++++++
manual/time.texi | 12 +++++++++++-
time/tzset.c | 7 +++++--
3 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 9b54d09..213f915 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
2013-09-18 Paul Eggert <eggert@cs.ucla.edu>
+ Support TZ transition times < 00:00:00.
+ This is needed for version-3 tz-format files; it supports time
+ stamps past 2037 for America/Godthab (the only entry in the tz
+ database for which this change is relevant).
+ * manual/time.texi (TZ Variable): Document transition times
+ from -167:59:59 through -00:00:01.
+ * time/tzset.c (tz_rule): Time of day is now signed.
+ (__tzset_parse_tz): Parse negative time of day.
+
Document TZ transition times >= 25:00:00.
* manual/time.texi (TZ Variable): Document transition times from
25:00:00 through 167:59:59. These are already supported, and this
diff --git a/manual/time.texi b/manual/time.texi
index 4768156..32cb306 100644
--- a/manual/time.texi
+++ b/manual/time.texi
@@ -2083,7 +2083,7 @@ between @code{1} and @code{12}.
The @var{time} fields specify when, in the local time currently in
effect, the change to the other time occurs. If omitted, the default is
@code{02:00:00}. The hours part of the time fields can range from
-0 through 167; this is an extension to POSIX.1, which allows
+@minus{}167 through 167; this is an extension to POSIX.1, which allows
only the range 0 through 24.
Here are some example @code{TZ} values, including the appropriate
@@ -2119,6 +2119,16 @@ is a placeholder.
WART4WARST,J1/0,J365/25
@end smallexample
+Western Greenland Time (WGT) and Western Greenland Summer Time (WGST)
+are 3 hours behind UTC in the winter. Its clocks follow the European
+Union rules of springing forward by one hour on March's last Sunday at
+01:00 UTC (@minus{}02:00 local time) and falling back on October's
+last Sunday at 01:00 UTC (@minus{}01:00 local time).
+
+@smallexample
+WGT3WGST,M3.5.0/-2,M10.5.0/-1
+@end smallexample
+
The schedule of Daylight Saving Time in any particular jurisdiction has
changed over the years. To be strictly correct, the conversion of dates
and times in the past should be based on the schedule that was in effect
diff --git a/time/tzset.c b/time/tzset.c
index 4f8af8d..fb2dccd 100644
--- a/time/tzset.c
+++ b/time/tzset.c
@@ -54,7 +54,7 @@ typedef struct
/* When to change. */
enum { J0, J1, M } type; /* Interpretation of: */
unsigned short int m, n, d; /* Month, week, day. */
- unsigned int secs; /* Time of day. */
+ int secs; /* Time of day. */
long int offset; /* Seconds east of GMT (west if < 0). */
@@ -362,9 +362,12 @@ __tzset_parse_tz (tz)
else if (*tz == '/')
{
/* Get the time of day of the change. */
+ int negative;
++tz;
if (*tz == '\0')
goto out;
+ negative = *tz == '-';
+ tz += negative;
consumed = 0;
switch (sscanf (tz, "%hu%n:%hu%n:%hu%n",
&hh, &consumed, &mm, &consumed, &ss, &consumed))
@@ -379,7 +382,7 @@ __tzset_parse_tz (tz)
break;
}
tz += consumed;
- tzr->secs = (hh * 60 * 60) + (mm * 60) + ss;
+ tzr->secs = (negative ? -1 : 1) * ((hh * 60 * 60) + (mm * 60) + ss);
}
else
/* Default to 2:00 AM. */
--
1.8.3.1