summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBranko Čibej <brane@apache.org>2002-06-09 20:25:51 +0000
committerBranko Čibej <brane@apache.org>2002-06-09 20:25:51 +0000
commit66e55d240fee7dfc8e8f0ec9a23bd650c282cb96 (patch)
tree1ab0777676e1cfbdd00624b850ec8d8b6f7f3e66
parent523448fc9a8d67e3d2c1c96b7d79c11bfdabdc13 (diff)
downloadapr-66e55d240fee7dfc8e8f0ec9a23bd650c282cb96.tar.gz
Fix calculation of tm_gmtoff on Windows, and add a test case.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@63485 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--test/testtime.c57
-rw-r--r--time/win32/time.c10
2 files changed, 53 insertions, 14 deletions
diff --git a/test/testtime.c b/test/testtime.c
index 39fcc5d61..a1ee2ce7b 100644
--- a/test/testtime.c
+++ b/test/testtime.c
@@ -62,6 +62,23 @@
#define STR_SIZE 45
+static const char* print_time (apr_pool_t *pool, const apr_time_exp_t *xt)
+{
+ return apr_psprintf (pool,
+ "%04d-%02d-%02d %02d:%02d:%02d.%06d %+05d [%d %s]%s",
+ xt->tm_year + 1900,
+ xt->tm_mon,
+ xt->tm_mday,
+ xt->tm_hour,
+ xt->tm_min,
+ xt->tm_sec,
+ xt->tm_usec,
+ xt->tm_gmtoff,
+ xt->tm_yday + 1,
+ apr_day_snames[xt->tm_wday],
+ (xt->tm_isdst ? " DST" : ""));
+}
+
int main(void)
{
apr_time_t now;
@@ -84,20 +101,39 @@ int main(void)
printf("OK\n");
STD_TEST_NEQ(" apr_time_exp_gmt", apr_time_exp_gmt(&xt, now))
-
+ printf(" (%s)\n", print_time(p, &xt));
+
STD_TEST_NEQ(" apr_time_exp_lt", apr_time_exp_lt(&xt2, now))
+ printf(" (%s)\n", print_time(p, &xt2));
STD_TEST_NEQ(" apr_time_exp_get (GMT)", apr_time_exp_get(&imp, &xt))
printf("%-60s", " checking GMT explode == implode");
- if (imp != now) {
- printf("mismatch\n"
+ hr_off_64 = (apr_int64_t) xt.tm_gmtoff * APR_USEC_PER_SEC;
+ if (imp != now + hr_off_64) {
+ printf("mismatch\n"
"\t\tapr_now() %" APR_INT64_T_FMT "\n"
"\t\tapr_implode() returned %" APR_INT64_T_FMT "\n"
"\t\terror delta was %" APR_TIME_T_FMT "\n"
- "\t\tshould have been 0\n",
- now, imp, imp-now);
- exit(-1);
+ "\t\tshould have been %" APR_INT64_T_FMT "\n",
+ now, imp, imp-now, hr_off_64);
+ exit(-1);
+ }
+ printf("OK\n");
+
+ STD_TEST_NEQ(" apr_time_exp_get (localtime)",
+ apr_time_exp_get(&imp, &xt2))
+
+ printf("%-60s", " checking localtime explode == implode");
+ hr_off_64 = (apr_int64_t) xt2.tm_gmtoff * APR_USEC_PER_SEC;
+ if (imp != now + hr_off_64) {
+ printf("mismatch\n"
+ "\t\tapr_now() %" APR_INT64_T_FMT "\n"
+ "\t\tapr_implode() returned %" APR_INT64_T_FMT "\n"
+ "\t\terror delta was %" APR_TIME_T_FMT "\n"
+ "\t\tshould have been %" APR_INT64_T_FMT "\n",
+ now, imp, imp-now, hr_off_64);
+ exit(-1);
}
printf("OK\n");
@@ -121,13 +157,13 @@ int main(void)
printf("%-60s", " checking localtime explode == GMT implode");
if (imp != now) {
- printf("mismatch\n"
+ printf("mismatch\n"
"\t\tapr_now() %" APR_INT64_T_FMT "\n"
"\t\tapr_implode() returned %" APR_INT64_T_FMT "\n"
"\t\terror delta was %" APR_TIME_T_FMT "\n"
"\t\tshould have been 0\n",
now, imp, imp-now);
- exit(-1);
+ exit(-1);
}
printf("OK\n");
@@ -178,8 +214,9 @@ int main(void)
exit(-1);
}
printf("OK\n");
- printf(" ( %lld - %lld = %lld )\n", imp, now, imp - now);
-
+ printf(" ( %" APR_TIME_T_FMT " - %" APR_TIME_T_FMT
+ " = %" APR_INT64_T_FMT " )\n", imp, now, imp - now);
+
printf("\nTest Complete.\n");
return 0;
}
diff --git a/time/win32/time.c b/time/win32/time.c
index d10935829..672b683cf 100644
--- a/time/win32/time.c
+++ b/time/win32/time.c
@@ -105,16 +105,19 @@ static void SystemTimeToAprExpTime(apr_time_exp_t *xt, SYSTEMTIME *tm, BOOL lt)
rc = GetTimeZoneInformation(&tz);
switch (rc) {
case TIME_ZONE_ID_UNKNOWN:
- case TIME_ZONE_ID_STANDARD:
xt->tm_isdst = 0;
/* Bias = UTC - local time in minutes
* tm_gmtoff is seconds east of UTC
*/
xt->tm_gmtoff = tz.Bias * -60;
break;
+ case TIME_ZONE_ID_STANDARD:
+ xt->tm_isdst = 0;
+ xt->tm_gmtoff = (tz.Bias + tz.StandardBias) * -60;
+ break;
case TIME_ZONE_ID_DAYLIGHT:
xt->tm_isdst = 1;
- xt->tm_gmtoff = tz.Bias * -60;
+ xt->tm_gmtoff = (tz.Bias + tz.DaylightBias) * -60;
break;
default:
xt->tm_isdst = 0;
@@ -224,8 +227,7 @@ APR_DECLARE(apr_status_t) apr_implode_gmt(apr_time_t *t,
{
apr_status_t status = apr_time_exp_get(t, xt);
if (status == APR_SUCCESS)
- *t -= (apr_time_t) (xt->tm_isdst * 3600
- + xt->tm_gmtoff) * APR_USEC_PER_SEC;
+ *t -= (apr_time_t) xt->tm_gmtoff * APR_USEC_PER_SEC;
return status;
}