summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>1994-04-24 22:17:40 +0000
committerJim Meyering <jim@meyering.net>1994-04-24 22:17:40 +0000
commitfebe31de876917ead522c03f91758f6ce6ca81f3 (patch)
tree65f87551d132ffe75c46195134b8d9ab7b278833
parent4bca89cf667765867ae29fe129e27655931dab18 (diff)
downloadgnulib-febe31de876917ead522c03f91758f6ce6ca81f3.tar.gz
GNU shell utilitiesSHELLUTILS-1_9_4f
-rw-r--r--lib/getdate.y56
1 files changed, 37 insertions, 19 deletions
diff --git a/lib/getdate.y b/lib/getdate.y
index 6d93a57d6f..fd545d6ca0 100644
--- a/lib/getdate.y
+++ b/lib/getdate.y
@@ -863,38 +863,56 @@ yylex()
}
}
+#define TM_YEAR_ORIGIN 1900
+
+/* Yield A - B, measured in seconds. */
+static long
+difftm (a, b)
+ struct tm *a, *b;
+{
+ int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
+ int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
+ int days = (
+ /* difference in day of year */
+ a->tm_yday - b->tm_yday
+ /* + intervening leap days */
+ + ((ay >> 2) - (by >> 2))
+ - (ay/100 - by/100)
+ + ((ay/100 >> 2) - (by/100 >> 2))
+ /* + difference in years * 365 */
+ + (long)(ay-by) * 365
+ );
+ return (60*(60*(24*days + (a->tm_hour - b->tm_hour))
+ + (a->tm_min - b->tm_min))
+ + (a->tm_sec - b->tm_sec));
+}
+
time_t
get_date(p, now)
char *p;
struct timeb *now;
{
- struct tm *tm;
+ struct tm *tm, gmt;
struct timeb ftz;
time_t Start;
time_t tod;
yyInput = p;
- if (now == NULL)
- {
- int tz;
- struct tm *tmp;
- time_t epoch = 0;
-
+ if (now == NULL) {
now = &ftz;
(void)time(&ftz.time);
- /* Compute local timezone. Do *not* take daylight savings
- into account here. */
- tmp = localtime (&epoch);
- tz = tmp->tm_hour * 60 + tmp->tm_min; /* Minutes east of UTC. */
- if (tz > 0)
- {
- tz = 24 * 60 - tz; /* Minutes west of UTC. */
- if (tmp->tm_year == 70)
- tz -= 24 * 60; /* Account for date line. */
- }
- ftz.timezone = tz;
- }
+ if (! (tm = gmtime (&ftz.time)))
+ return -1;
+ gmt = *tm;
+
+ if (! (tm = localtime (&ftz.time)))
+ return -1;
+
+ ftz.timezone = difftm (&gmt, tm) / 60;
+ if(tm->tm_isdst)
+ ftz.timezone += 60;
+ }
tm = localtime(&now->time);
yyYear = tm->tm_year;