diff options
author | brane <brane@13f79535-47bb-0310-9956-ffa450edef68> | 2002-06-09 20:25:51 +0000 |
---|---|---|
committer | brane <brane@13f79535-47bb-0310-9956-ffa450edef68> | 2002-06-09 20:25:51 +0000 |
commit | 528947bf76452888723f433676229ed918d9a1a3 (patch) | |
tree | 1ab0777676e1cfbdd00624b850ec8d8b6f7f3e66 | |
parent | 8dea3991b71c09dff85d1148d553d583646911e4 (diff) | |
download | libapr-528947bf76452888723f433676229ed918d9a1a3.tar.gz |
Fix calculation of tm_gmtoff on Windows, and add a test case.
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@63485 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | test/testtime.c | 57 | ||||
-rw-r--r-- | time/win32/time.c | 10 |
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; } |