more portable and Windows version for getTimezoneOffset() (github issue #122)

This commit is contained in:
Fabrice Bellard 2024-01-11 15:26:39 +01:00
parent 195c42b9fb
commit e66ce48872

View file

@ -43165,14 +43165,11 @@ static const JSCFunctionListEntry js_math_obj[] = {
/* OS dependent. d = argv[0] is in ms from 1970. Return the difference /* OS dependent. d = argv[0] is in ms from 1970. Return the difference
between UTC time and local time 'd' in minutes */ between UTC time and local time 'd' in minutes */
static int getTimezoneOffset(int64_t time) { static int getTimezoneOffset(int64_t time)
#if defined(_WIN32) {
/* XXX: TODO */
return 0;
#else
time_t ti; time_t ti;
struct tm tm; int res;
time /= 1000; /* convert to seconds */ time /= 1000; /* convert to seconds */
if (sizeof(time_t) == 4) { if (sizeof(time_t) == 4) {
/* on 32-bit systems, we need to clamp the time value to the /* on 32-bit systems, we need to clamp the time value to the
@ -43195,9 +43192,27 @@ static int getTimezoneOffset(int64_t time) {
} }
} }
ti = time; ti = time;
localtime_r(&ti, &tm); #if defined(_WIN32)
return -tm.tm_gmtoff / 60; {
struct tm *tm;
time_t gm_ti, loc_ti;
tm = gmtime(&ti);
gm_ti = mktime(tm);
tm = localtime(&ti);
loc_ti = mktime(tm);
res = (gm_ti - loc_ti) / 60;
}
#else
{
struct tm tm;
localtime_r(&ti, &tm);
res = -tm.tm_gmtoff / 60;
}
#endif #endif
return res;
} }
#if 0 #if 0