mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-03-01 19:45:33 +08:00
Also removed the function not just the call, sorry.
This commit is contained in:
parent
439cf8e676
commit
9ab58bbda6
@ -1,4 +1,4 @@
|
|||||||
/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/dt_common.c,v 1.39 2007/05/21 07:04:00 meskes Exp $ */
|
/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/dt_common.c,v 1.40 2007/05/21 07:07:48 meskes Exp $ */
|
||||||
|
|
||||||
#include "postgres_fe.h"
|
#include "postgres_fe.h"
|
||||||
|
|
||||||
@ -1090,159 +1090,6 @@ GetCurrentDateTime(struct tm * tm)
|
|||||||
abstime2tm(time(NULL), &tz, tm, NULL);
|
abstime2tm(time(NULL), &tz, tm, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* DetermineLocalTimeZone()
|
|
||||||
*
|
|
||||||
* Given a struct tm in which tm_year, tm_mon, tm_mday, tm_hour, tm_min, and
|
|
||||||
* tm_sec fields are set, attempt to determine the applicable local zone
|
|
||||||
* (ie, regular or daylight-savings time) at that time. Set the struct tm's
|
|
||||||
* tm_isdst field accordingly, and return the actual timezone offset.
|
|
||||||
*
|
|
||||||
* This subroutine exists to centralize uses of mktime() and defend against
|
|
||||||
* mktime() bugs/restrictions on various platforms. This should be
|
|
||||||
* the *only* call of mktime() in the backend.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
DetermineLocalTimeZone(struct tm * tm)
|
|
||||||
{
|
|
||||||
int tz;
|
|
||||||
|
|
||||||
if (IS_VALID_UTIME(tm->tm_year, tm->tm_mon, tm->tm_mday))
|
|
||||||
{
|
|
||||||
#if defined(HAVE_TM_ZONE) || defined(HAVE_INT_TIMEZONE)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Some buggy mktime() implementations may change the year/month/day
|
|
||||||
* when given a time right at a DST boundary. To prevent corruption
|
|
||||||
* of the caller's data, give mktime() a copy...
|
|
||||||
*/
|
|
||||||
struct tm tt,
|
|
||||||
*tmp = &tt;
|
|
||||||
|
|
||||||
*tmp = *tm;
|
|
||||||
/* change to Unix conventions for year/month */
|
|
||||||
tmp->tm_year -= 1900;
|
|
||||||
tmp->tm_mon -= 1;
|
|
||||||
|
|
||||||
/* indicate timezone unknown */
|
|
||||||
tmp->tm_isdst = -1;
|
|
||||||
|
|
||||||
if (mktime(tmp) != (time_t) -1 && tmp->tm_isdst >= 0)
|
|
||||||
{
|
|
||||||
/* mktime() succeeded, trust its result */
|
|
||||||
tm->tm_isdst = tmp->tm_isdst;
|
|
||||||
|
|
||||||
#if defined(HAVE_TM_ZONE)
|
|
||||||
/* tm_gmtoff is Sun/DEC-ism */
|
|
||||||
tz = -tmp->tm_gmtoff;
|
|
||||||
#elif defined(HAVE_INT_TIMEZONE)
|
|
||||||
tz = (tmp->tm_isdst > 0) ? TIMEZONE_GLOBAL - SECS_PER_HOUR : TIMEZONE_GLOBAL;
|
|
||||||
#endif /* HAVE_INT_TIMEZONE */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* We have a buggy (not to say deliberately brain damaged)
|
|
||||||
* mktime(). Work around it by using localtime() instead.
|
|
||||||
*
|
|
||||||
* First, generate the time_t value corresponding to the given
|
|
||||||
* y/m/d/h/m/s taken as GMT time. This will not overflow (at
|
|
||||||
* least not for time_t taken as signed) because of the range
|
|
||||||
* check we did above.
|
|
||||||
*/
|
|
||||||
long day,
|
|
||||||
mysec,
|
|
||||||
locsec,
|
|
||||||
delta1,
|
|
||||||
delta2;
|
|
||||||
time_t mytime;
|
|
||||||
|
|
||||||
day = (date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) -
|
|
||||||
date2j(1970, 1, 1));
|
|
||||||
mysec = tm->tm_sec + (tm->tm_min + (day * HOURS_PER_DAY + tm->tm_hour) * MINS_PER_HOUR) * SECS_PER_MINUTE;
|
|
||||||
mytime = (time_t) mysec;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Use localtime to convert that time_t to broken-down time, and
|
|
||||||
* reassemble to get a representation of local time.
|
|
||||||
*/
|
|
||||||
tmp = localtime(&mytime);
|
|
||||||
if (!tmp)
|
|
||||||
{
|
|
||||||
tm->tm_isdst = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
day = (date2j(tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday) -
|
|
||||||
date2j(1970, 1, 1));
|
|
||||||
locsec = tmp->tm_sec + (tmp->tm_min + (day * HOURS_PER_DAY + tmp->tm_hour) * MINS_PER_HOUR) * SECS_PER_MINUTE;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The local time offset corresponding to that GMT time is now
|
|
||||||
* computable as mysec - locsec.
|
|
||||||
*/
|
|
||||||
delta1 = mysec - locsec;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* However, if that GMT time and the local time we are actually
|
|
||||||
* interested in are on opposite sides of a daylight-savings-time
|
|
||||||
* transition, then this is not the time offset we want. So,
|
|
||||||
* adjust the time_t to be what we think the GMT time
|
|
||||||
* corresponding to our target local time is, and repeat the
|
|
||||||
* localtime() call and delta calculation. We may have to do it
|
|
||||||
* twice before we have a trustworthy delta.
|
|
||||||
*
|
|
||||||
* Note: think not to put a loop here, since if we've been given
|
|
||||||
* an "impossible" local time (in the gap during a spring-forward
|
|
||||||
* transition) we'd never get out of the loop. Twice is enough to
|
|
||||||
* give the behavior we want, which is that "impossible" times are
|
|
||||||
* taken as standard time, while at a fall-back boundary ambiguous
|
|
||||||
* times are also taken as standard.
|
|
||||||
*/
|
|
||||||
mysec += delta1;
|
|
||||||
mytime = (time_t) mysec;
|
|
||||||
tmp = localtime(&mytime);
|
|
||||||
if (!tmp)
|
|
||||||
{
|
|
||||||
tm->tm_isdst = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
day = (date2j(tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday) -
|
|
||||||
date2j(1970, 1, 1));
|
|
||||||
locsec = tmp->tm_sec + (tmp->tm_min + (day * HOURS_PER_DAY + tmp->tm_hour) * MINS_PER_HOUR) * SECS_PER_MINUTE;
|
|
||||||
delta2 = mysec - locsec;
|
|
||||||
if (delta2 != delta1)
|
|
||||||
{
|
|
||||||
mysec += (delta2 - delta1);
|
|
||||||
mytime = (time_t) mysec;
|
|
||||||
tmp = localtime(&mytime);
|
|
||||||
if (!tmp)
|
|
||||||
{
|
|
||||||
tm->tm_isdst = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
day = (date2j(tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday) -
|
|
||||||
date2j(1970, 1, 1));
|
|
||||||
locsec = tmp->tm_sec + (tmp->tm_min + (day * HOURS_PER_DAY + tmp->tm_hour) * MINS_PER_HOUR) * SECS_PER_MINUTE;
|
|
||||||
delta2 = mysec - locsec;
|
|
||||||
}
|
|
||||||
tm->tm_isdst = tmp->tm_isdst;
|
|
||||||
tz = (int) delta2;
|
|
||||||
}
|
|
||||||
#else /* not (HAVE_TM_ZONE || HAVE_INT_TIMEZONE) */
|
|
||||||
/* Assume UTC if no system timezone info available */
|
|
||||||
tm->tm_isdst = 0;
|
|
||||||
tz = 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Given date is out of range, so assume UTC */
|
|
||||||
tm->tm_isdst = 0;
|
|
||||||
tz = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return tz;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dt2time(double jd, int *hour, int *min, int *sec, fsec_t *fsec)
|
dt2time(double jd, int *hour, int *min, int *sec, fsec_t *fsec)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user