mirror of
https://github.com/postgres/postgres.git
synced 2025-11-03 09:13:20 +03:00
Fix date/time formats for XML Schema output.
Pavel Stehule
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.177 2007/02/19 17:41:39 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.178 2007/03/01 14:52:03 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -3153,7 +3153,7 @@ datebsearch(const char *key, const datetkn *base, int nel)
|
||||
* Append representation of a numeric timezone offset to str.
|
||||
*/
|
||||
static void
|
||||
EncodeTimezone(char *str, int tz)
|
||||
EncodeTimezone(char *str, int tz, int style)
|
||||
{
|
||||
int hour,
|
||||
min,
|
||||
@@ -3171,7 +3171,7 @@ EncodeTimezone(char *str, int tz)
|
||||
|
||||
if (sec != 0)
|
||||
sprintf(str, "%02d:%02d:%02d", hour, min, sec);
|
||||
else if (min != 0)
|
||||
else if (min != 0 || style == USE_XSD_DATES)
|
||||
sprintf(str, "%02d:%02d", hour, min);
|
||||
else
|
||||
sprintf(str, "%02d", hour);
|
||||
@@ -3189,6 +3189,7 @@ EncodeDateOnly(struct pg_tm * tm, int style, char *str)
|
||||
switch (style)
|
||||
{
|
||||
case USE_ISO_DATES:
|
||||
case USE_XSD_DATES:
|
||||
/* compatible with ISO date formats */
|
||||
if (tm->tm_year > 0)
|
||||
sprintf(str, "%04d-%02d-%02d",
|
||||
@@ -3266,7 +3267,7 @@ EncodeTimeOnly(struct pg_tm * tm, fsec_t fsec, int *tzp, int style, char *str)
|
||||
sprintf(str + strlen(str), ":%02d", tm->tm_sec);
|
||||
|
||||
if (tzp != NULL)
|
||||
EncodeTimezone(str, *tzp);
|
||||
EncodeTimezone(str, *tzp, style);
|
||||
|
||||
return TRUE;
|
||||
} /* EncodeTimeOnly() */
|
||||
@@ -3279,6 +3280,7 @@ EncodeTimeOnly(struct pg_tm * tm, fsec_t fsec, int *tzp, int style, char *str)
|
||||
* SQL - mm/dd/yyyy hh:mm:ss.ss tz
|
||||
* ISO - yyyy-mm-dd hh:mm:ss+/-tz
|
||||
* German - dd.mm.yyyy hh:mm:ss tz
|
||||
* XSD - yyyy-mm-ddThh:mm:ss.ss+/-tz
|
||||
* Variants (affects order of month and day for Postgres and SQL styles):
|
||||
* US - mm/dd/yyyy
|
||||
* European - dd/mm/yyyy
|
||||
@@ -3297,11 +3299,18 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style,
|
||||
switch (style)
|
||||
{
|
||||
case USE_ISO_DATES:
|
||||
case USE_XSD_DATES:
|
||||
/* Compatible with ISO-8601 date formats */
|
||||
|
||||
sprintf(str, "%04d-%02d-%02d %02d:%02d",
|
||||
if (style == USE_ISO_DATES)
|
||||
sprintf(str, "%04d-%02d-%02d %02d:%02d",
|
||||
(tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1),
|
||||
tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min);
|
||||
else
|
||||
sprintf(str, "%04d-%02d-%02dT%02d:%02d",
|
||||
(tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1),
|
||||
tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min);
|
||||
|
||||
|
||||
/*
|
||||
* Print fractional seconds if any. The field widths here should
|
||||
@@ -3333,7 +3342,7 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style,
|
||||
* a valid time zone translation.
|
||||
*/
|
||||
if (tzp != NULL && tm->tm_isdst >= 0)
|
||||
EncodeTimezone(str, *tzp);
|
||||
EncodeTimezone(str, *tzp, style);
|
||||
|
||||
if (tm->tm_year <= 0)
|
||||
sprintf(str + strlen(str), " BC");
|
||||
@@ -3379,7 +3388,7 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style,
|
||||
if (*tzn != NULL)
|
||||
sprintf(str + strlen(str), " %.*s", MAXTZLEN, *tzn);
|
||||
else
|
||||
EncodeTimezone(str, *tzp);
|
||||
EncodeTimezone(str, *tzp, style);
|
||||
}
|
||||
|
||||
if (tm->tm_year <= 0)
|
||||
@@ -3423,7 +3432,7 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style,
|
||||
if (*tzn != NULL)
|
||||
sprintf(str + strlen(str), " %.*s", MAXTZLEN, *tzn);
|
||||
else
|
||||
EncodeTimezone(str, *tzp);
|
||||
EncodeTimezone(str, *tzp, style);
|
||||
}
|
||||
|
||||
if (tm->tm_year <= 0)
|
||||
@@ -3486,7 +3495,7 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style,
|
||||
* the date/time parser later. - thomas 2001-10-19
|
||||
*/
|
||||
sprintf(str + strlen(str), " ");
|
||||
EncodeTimezone(str, *tzp);
|
||||
EncodeTimezone(str, *tzp, style);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user