diff options
Diffstat (limited to 'src/backend/utils/adt/datetime.c')
-rw-r--r-- | src/backend/utils/adt/datetime.c | 65 |
1 files changed, 37 insertions, 28 deletions
diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index f495c3f0109..56515f15b9d 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -3679,39 +3679,54 @@ EncodeDateOnly(struct pg_tm * tm, int style, char *str) /* EncodeTimeOnly() * Encode time fields only. + * + * tm and fsec are the value to encode, print_tz determines whether to include + * a time zone (the difference between time and timetz types), tz is the + * numeric time zone offset, style is the date style, str is where to write the + * output. */ void -EncodeTimeOnly(struct pg_tm * tm, fsec_t fsec, int *tzp, int style, char *str) +EncodeTimeOnly(struct pg_tm * tm, fsec_t fsec, bool print_tz, int tz, int style, char *str) { sprintf(str, "%02d:%02d:", tm->tm_hour, tm->tm_min); str += strlen(str); AppendSeconds(str, tm->tm_sec, fsec, MAX_TIME_PRECISION, true); - if (tzp != NULL) - EncodeTimezone(str, *tzp, style); + if (print_tz) + EncodeTimezone(str, tz, style); } /* EncodeDateTime() * Encode date and time interpreted as local time. - * Support several date styles: + * + * tm and fsec are the value to encode, print_tz determines whether to include + * a time zone (the difference between timestamp and timestamptz types), tz is + * the numeric time zone offset, tzn is the textual time zone, which if + * specified will be used instead of tz by some styles, style is the date + * style, str is where to write the output. + * + * Supported date styles: * Postgres - day mon hh:mm:ss yyyy tz * 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 */ void -EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, char *str) +EncodeDateTime(struct pg_tm * tm, fsec_t fsec, bool print_tz, int tz, const char *tzn, int style, char *str) { int day; Assert(tm->tm_mon >= 1 && tm->tm_mon <= MONTHS_PER_YEAR); + /* + * Negative tm_isdst means we have no valid time zone translation. + */ + if (tm->tm_isdst < 0) + print_tz = false; + switch (style) { case USE_ISO_DATES: @@ -3729,14 +3744,8 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, AppendTimestampSeconds(str + strlen(str), tm, fsec); - /* - * tzp == NULL indicates that we don't want *any* time zone info - * in the output string. *tzn != NULL indicates that we have alpha - * time zone info available. tm_isdst != -1 indicates that we have - * a valid time zone translation. - */ - if (tzp != NULL && tm->tm_isdst >= 0) - EncodeTimezone(str, *tzp, style); + if (print_tz) + EncodeTimezone(str, tz, style); if (tm->tm_year <= 0) sprintf(str + strlen(str), " BC"); @@ -3762,12 +3771,12 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, * TZ abbreviations in the Olson database are plain ASCII. */ - if (tzp != NULL && tm->tm_isdst >= 0) + if (print_tz) { - if (*tzn != NULL) - sprintf(str + strlen(str), " %.*s", MAXTZLEN, *tzn); + if (tzn) + sprintf(str + strlen(str), " %.*s", MAXTZLEN, tzn); else - EncodeTimezone(str, *tzp, style); + EncodeTimezone(str, tz, style); } if (tm->tm_year <= 0) @@ -3785,12 +3794,12 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, AppendTimestampSeconds(str + strlen(str), tm, fsec); - if (tzp != NULL && tm->tm_isdst >= 0) + if (print_tz) { - if (*tzn != NULL) - sprintf(str + strlen(str), " %.*s", MAXTZLEN, *tzn); + if (tzn) + sprintf(str + strlen(str), " %.*s", MAXTZLEN, tzn); else - EncodeTimezone(str, *tzp, style); + EncodeTimezone(str, tz, style); } if (tm->tm_year <= 0) @@ -3819,10 +3828,10 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, sprintf(str + strlen(str), " %04d", (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1)); - if (tzp != NULL && tm->tm_isdst >= 0) + if (print_tz) { - if (*tzn != NULL) - sprintf(str + strlen(str), " %.*s", MAXTZLEN, *tzn); + if (tzn) + sprintf(str + strlen(str), " %.*s", MAXTZLEN, tzn); else { /* @@ -3832,7 +3841,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, style); + EncodeTimezone(str, tz, style); } } |