Recognize special case of POSIX time zone: "GMT+8" and "GMT-8".
Still needs to be done for the general case: "tz+/-#" where tz is a 3 char string. This will probably involve moving code around to other places.
This commit is contained in:
parent
7c07006ad4
commit
929e50ece8
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/dt.c,v 1.82 2000/01/26 05:57:13 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/dt.c,v 1.83 2000/02/15 03:17:09 thomas Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -1981,7 +1981,11 @@ static datetkn datetktbl[] = {
|
||||
{"cdt", DTZ, NEG(30)}, /* Central Daylight Time */
|
||||
{"cet", TZ, 6}, /* Central European Time */
|
||||
{"cetdst", DTZ, 12}, /* Central European Dayl.Time */
|
||||
#if USE_AUSTRALIAN_RULES
|
||||
{"cst", TZ, 63}, /* Australia Eastern Std Time */
|
||||
#else
|
||||
{"cst", TZ, NEG(36)}, /* Central Standard Time */
|
||||
#endif
|
||||
{DCURRENT, RESERV, DTK_CURRENT}, /* "current" is always now */
|
||||
{"dec", MONTH, 12},
|
||||
{"december", MONTH, 12},
|
||||
@ -1989,7 +1993,7 @@ static datetkn datetktbl[] = {
|
||||
{"dow", RESERV, DTK_DOW}, /* day of week */
|
||||
{"doy", RESERV, DTK_DOY}, /* day of year */
|
||||
{"dst", DTZMOD, 6},
|
||||
{"east", TZ, NEG(60)}, /* East Australian Std Time */
|
||||
{"east", TZ, 60}, /* East Australian Std Time */
|
||||
{"edt", DTZ, NEG(24)}, /* Eastern Daylight Time */
|
||||
{"eet", TZ, 12}, /* East. Europe, USSR Zone 1 */
|
||||
{"eetdst", DTZ, 18}, /* Eastern Europe */
|
||||
@ -2552,6 +2556,23 @@ ParseDateTime(char *timestr, char *lowstr,
|
||||
/* full date string with leading text month? */
|
||||
if ((*cp == '-') || (*cp == '/') || (*cp == '.'))
|
||||
{
|
||||
/*
|
||||
* special case of Posix timezone "GMT-0800"
|
||||
* Note that other sign (e.g. "GMT+0800"
|
||||
* is recognized as two separate fields and handled later.
|
||||
* XXX There is no room for a delimiter between
|
||||
* the "GMT" and the "-0800", so we are going to just swallow the "GMT".
|
||||
* But this leads to other troubles with the definition of signs,
|
||||
* so we have to flip
|
||||
* - thomas 2000-02-06
|
||||
*/
|
||||
if ((*cp == '-') && isdigit(*(cp+1))
|
||||
&& (strncmp(field[nf], "gmt", 3) == 0))
|
||||
{
|
||||
*cp = '+';
|
||||
continue;
|
||||
}
|
||||
|
||||
ftype[nf] = DTK_DATE;
|
||||
while (isdigit(*cp) || (*cp == '-') || (*cp == '/') || (*cp == '.'))
|
||||
*lp++ = tolower(*cp++);
|
||||
@ -2826,6 +2847,25 @@ DecodeDateTime(char **field, int *ftype, int nf,
|
||||
if (tzp == NULL)
|
||||
return -1;
|
||||
*tzp = val * 60;
|
||||
|
||||
/* Swallow an immediately succeeding timezone if this is GMT
|
||||
* This handles the odd case in FreeBSD of "GMT+0800"
|
||||
* but note that we need to flip the sign on this too.
|
||||
* Claims to be some sort of POSIX standard format :(
|
||||
* - thomas 2000-01-20
|
||||
*/
|
||||
if ((i < (nf-1)) && (ftype[i+1] == DTK_TZ)
|
||||
&& (strcmp(field[i], "gmt") == 0))
|
||||
{
|
||||
i++;
|
||||
if (DecodeTimezone(field[i], tzp) != 0)
|
||||
return -1;
|
||||
|
||||
/* flip the sign per POSIX standard */
|
||||
*tzp = -(*tzp);
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
|
||||
case IGNORE:
|
||||
|
Loading…
x
Reference in New Issue
Block a user