Module Name: src
Committed By: apb
Date: Sat Jan 19 09:27:32 UTC 2013
Modified Files:
src/lib/libutil: parsedate.y
Log Message:
mktime(3) works in local time, and trying to trick it by
setting tm_gmtoff doesn't work. Instead, call mktime_z(3)
with a null timezone (so it works in UTC) and adjust the
result afterwards. Now "date -d @0" correctly
prints the local equivalent of 1970-01-01 00:00:00 UTC.
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/lib/libutil/parsedate.y
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libutil/parsedate.y
diff -u src/lib/libutil/parsedate.y:1.12 src/lib/libutil/parsedate.y:1.13
--- src/lib/libutil/parsedate.y:1.12 Thu Sep 13 21:44:50 2012
+++ src/lib/libutil/parsedate.y Sat Jan 19 09:27:32 2013
@@ -590,7 +590,8 @@ Convert(
DSTMODE DSTmode /* DST on/off/maybe */
)
{
- struct tm tm;
+ struct tm tm = {.tm_sec = 0};
+ time_t result;
/* XXX Y2K */
if (Year < 0)
@@ -611,9 +612,11 @@ Convert(
case DSToff: tm.tm_isdst = 0; break;
default: tm.tm_isdst = -1; break;
}
- tm.tm_gmtoff = -Timezone;
- return mktime(&tm);
+ /* We rely on mktime_z(NULL, ...) working in UTC, not in local time. */
+ result = mktime_z(NULL, &tm);
+ result -= Timezone;
+ return result;
}