Add 'GERMAN' style to date/time output.

Probably have it wrong (dd.mm/yyyy) but can change it when we know.
 Input routines always handled it.
This commit is contained in:
Thomas G. Lockhart 1997-12-04 23:30:52 +00:00
parent d7e0e61d84
commit 352b36877f

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/dt.c,v 1.44 1997/11/17 16:23:33 thomas Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/dt.c,v 1.45 1997/12/04 23:30:52 thomas Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -4099,103 +4099,54 @@ EncodeSpecialDateTime(DateTime dt, char *str)
int int
EncodeDateOnly(struct tm * tm, int style, char *str) EncodeDateOnly(struct tm * tm, int style, char *str)
{ {
#if FALSE
int day;
#endif
if ((tm->tm_mon < 1) || (tm->tm_mon > 12)) if ((tm->tm_mon < 1) || (tm->tm_mon > 12))
return -1; return -1;
/* compatible with ISO date formats */ switch (style)
if (style == USE_ISO_DATES)
{ {
if (tm->tm_year > 0) /* compatible with ISO date formats */
{ case USE_ISO_DATES:
sprintf(str, "%04d-%02d-%02d", if (tm->tm_year > 0)
sprintf(str, "%04d-%02d-%02d",
tm->tm_year, tm->tm_mon, tm->tm_mday); tm->tm_year, tm->tm_mon, tm->tm_mday);
else
} sprintf(str, "%04d-%02d-%02d %s",
else
{
sprintf(str, "%04d-%02d-%02d %s",
-(tm->tm_year - 1), tm->tm_mon, tm->tm_mday, "BC"); -(tm->tm_year - 1), tm->tm_mon, tm->tm_mday, "BC");
} break;
/* compatible with Oracle/Ingres date formats */ /* compatible with Oracle/Ingres date formats */
} case USE_SQL_DATES:
else if (style == USE_SQL_DATES) if (EuroDates)
{ sprintf(str, "%02d/%02d", tm->tm_mday, tm->tm_mon);
if (EuroDates) else
{ sprintf(str, "%02d/%02d", tm->tm_mon, tm->tm_mday);
sprintf(str, "%02d/%02d", tm->tm_mday, tm->tm_mon); if (tm->tm_year > 0)
} sprintf((str + 5), "/%04d", tm->tm_year);
else else
{ sprintf((str + 5), "/%04d %s", -(tm->tm_year - 1), "BC");
sprintf(str, "%02d/%02d", tm->tm_mon, tm->tm_mday); break;
}
if (tm->tm_year > 0)
{
sprintf((str + 5), "/%04d", tm->tm_year);
} /* German-style date format */
else case USE_GERMAN_DATES:
{ sprintf(str, "%02d.%02d", tm->tm_mday, tm->tm_mon);
sprintf((str + 5), "/%04d %s", -(tm->tm_year - 1), "BC"); if (tm->tm_year > 0)
} sprintf((str + 5), "/%04d", tm->tm_year);
else
/* backward-compatible with traditional Postgres abstime dates */ sprintf((str + 5), "/%04d %s", -(tm->tm_year - 1), "BC");
} break;
else
{ /* if (style == USE_POSTGRES_DATES) */
#if FALSE
day = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday);
#ifdef DATEDEBUG
printf("EncodeDateOnly- day is %d\n", day);
#endif
tm->tm_wday = j2day(day);
strncpy(str, days[tm->tm_wday], 3);
strcpy((str + 3), " ");
if (EuroDates)
{
sprintf((str + 4), "%02d %3s", tm->tm_mday, months[tm->tm_mon - 1]);
}
else
{
sprintf((str + 4), "%3s %02d", months[tm->tm_mon - 1], tm->tm_mday);
}
if (tm->tm_year > 0)
{
sprintf((str + 10), " %04d", tm->tm_year);
}
else
{
sprintf((str + 10), " %04d %s", -(tm->tm_year - 1), "BC");
}
#endif
/* traditional date-only style for Postgres */ /* traditional date-only style for Postgres */
if (EuroDates) case USE_POSTGRES_DATES:
{ default:
sprintf(str, "%02d-%02d", tm->tm_mday, tm->tm_mon); if (EuroDates)
} sprintf(str, "%02d-%02d", tm->tm_mday, tm->tm_mon);
else else
{ sprintf(str, "%02d-%02d", tm->tm_mon, tm->tm_mday);
sprintf(str, "%02d-%02d", tm->tm_mon, tm->tm_mday); if (tm->tm_year > 0)
} sprintf((str + 5), "-%04d", tm->tm_year);
if (tm->tm_year > 0) else
{ sprintf((str + 5), "-%04d %s", -(tm->tm_year - 1), "BC");
sprintf((str + 5), "-%04d", tm->tm_year); break;
}
else
{
sprintf((str + 5), "-%04d %s", -(tm->tm_year - 1), "BC");
}
} }
#ifdef DATEDEBUG #ifdef DATEDEBUG
@ -4232,6 +4183,14 @@ EncodeTimeOnly(struct tm * tm, double fsec, int style, char *str)
/* EncodeDateTime() /* EncodeDateTime()
* Encode date and time interpreted as local time. * Encode date and time interpreted as local time.
* Support several 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
* Variants (affects order of month and day for Postgres and SQL styles):
* US - mm/dd/yyyy
* European - dd/mm/yyyy
*/ */
int int
EncodeDateTime(struct tm * tm, double fsec, int *tzp, char **tzn, int style, char *str) EncodeDateTime(struct tm * tm, double fsec, int *tzp, char **tzn, int style, char *str)
@ -4261,124 +4220,134 @@ EncodeDateTime(struct tm * tm, double fsec, int *tzp, char **tzn, int style, cha
#endif #endif
#endif #endif
/* compatible with ISO date formats */ switch (style)
if (style == USE_ISO_DATES)
{ {
if (tm->tm_year > 0) /* compatible with ISO date formats */
{
sprintf(str, "%04d-%02d-%02d %02d:%02d:",
tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min);
sprintf((str + 17), ((fsec != 0) ? "%05.2f" : "%02.0f"), sec);
if ((*tzn != NULL) && (tm->tm_isdst >= 0)) case USE_ISO_DATES:
if (tm->tm_year > 0)
{ {
if (tzp != NULL) sprintf(str, "%04d-%02d-%02d %02d:%02d:",
tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min);
sprintf((str + 17), ((fsec != 0) ? "%05.2f" : "%02.0f"), sec);
if ((*tzn != NULL) && (tm->tm_isdst >= 0))
{ {
hour = -(*tzp / 3600); if (tzp != NULL)
min = ((abs(*tzp) / 60) % 60); {
hour = -(*tzp / 3600);
min = ((abs(*tzp) / 60) % 60);
}
else
{
hour = 0;
min = 0;
}
sprintf((str + strlen(str)), ((min != 0) ? "%+03d:%02d" : "%+03d"), hour, min);
}
}
else
{
if (tm->tm_hour || tm->tm_min)
sprintf(str, "%04d-%02d-%02d %02d:%02d %s",
-(tm->tm_year - 1), tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, "BC");
else
sprintf(str, "%04d-%02d-%02d %s",
-(tm->tm_year - 1), tm->tm_mon, tm->tm_mday, "BC");
}
break;
/* compatible with Oracle/Ingres date formats */
case USE_SQL_DATES:
if (EuroDates)
sprintf(str, "%02d/%02d", tm->tm_mday, tm->tm_mon);
else
sprintf(str, "%02d/%02d", tm->tm_mon, tm->tm_mday);
if (tm->tm_year > 0)
{
sprintf((str + 5), "/%04d %02d:%02d:%05.2f",
tm->tm_year, tm->tm_hour, tm->tm_min, sec);
if ((*tzn != NULL) && (tm->tm_isdst >= 0))
{
strcpy((str + 22), " ");
strcpy((str + 23), *tzn);
}
}
else
sprintf((str + 5), "/%04d %02d:%02d %s",
-(tm->tm_year - 1), tm->tm_hour, tm->tm_min, "BC");
break;
/* German variant on European style; note mixed delimiters dd.mm/yyyy */
case USE_GERMAN_DATES:
sprintf(str, "%02d.%02d", tm->tm_mday, tm->tm_mon);
if (tm->tm_year > 0)
{
sprintf((str + 5), "/%04d %02d:%02d:%05.2f",
tm->tm_year, tm->tm_hour, tm->tm_min, sec);
if ((*tzn != NULL) && (tm->tm_isdst >= 0))
{
strcpy((str + 22), " ");
strcpy((str + 23), *tzn);
}
}
else
sprintf((str + 5), "/%04d %02d:%02d %s",
-(tm->tm_year - 1), tm->tm_hour, tm->tm_min, "BC");
break;
/* backward-compatible with traditional Postgres abstime dates */
case USE_POSTGRES_DATES:
default:
day = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday);
#ifdef DATEDEBUG
printf("EncodeDateTime- day is %d\n", day);
#endif
tm->tm_wday = j2day(day);
strncpy(str, days[tm->tm_wday], 3);
strcpy((str + 3), " ");
if (EuroDates)
sprintf((str + 4), "%02d %3s", tm->tm_mday, months[tm->tm_mon - 1]);
else
sprintf((str + 4), "%3s %02d", months[tm->tm_mon - 1], tm->tm_mday);
if (tm->tm_year > 0)
{
sprintf((str + 10), " %02d:%02d", tm->tm_hour, tm->tm_min);
if (fsec != 0)
{
sprintf((str + 16), ":%05.2f %04d", sec, tm->tm_year);
if ((*tzn != NULL) && (tm->tm_isdst >= 0))
{
strcpy((str + 27), " ");
strcpy((str + 28), *tzn);
}
} }
else else
{ {
hour = 0; sprintf((str + 16), ":%02.0f %04d", sec, tm->tm_year);
min = 0; if ((*tzn != NULL) && (tm->tm_isdst >= 0))
{
strcpy((str + 24), " ");
strcpy((str + 25), *tzn);
}
} }
sprintf((str + strlen(str)), ((min != 0) ? "%+03d:%02d" : "%+03d"), hour, min);
}
}
else
{
if (tm->tm_hour || tm->tm_min)
{
sprintf(str, "%04d-%02d-%02d %02d:%02d %s",
-(tm->tm_year - 1), tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, "BC");
} }
else else
{ {
sprintf(str, "%04d-%02d-%02d %s", sprintf((str + 10), " %02d:%02d %04d %s",
-(tm->tm_year - 1), tm->tm_mon, tm->tm_mday, "BC");
}
}
/* compatible with Oracle/Ingres date formats */
}
else if (style == USE_SQL_DATES)
{
if (EuroDates)
{
sprintf(str, "%02d/%02d", tm->tm_mday, tm->tm_mon);
}
else
{
sprintf(str, "%02d/%02d", tm->tm_mon, tm->tm_mday);
}
if (tm->tm_year > 0)
{
sprintf((str + 5), "/%04d %02d:%02d:%05.2f",
tm->tm_year, tm->tm_hour, tm->tm_min, sec);
if ((*tzn != NULL) && (tm->tm_isdst >= 0))
{
strcpy((str + 22), " ");
strcpy((str + 23), *tzn);
}
}
else
{
sprintf((str + 5), "/%04d %02d:%02d %s",
-(tm->tm_year - 1), tm->tm_hour, tm->tm_min, "BC");
}
/* backward-compatible with traditional Postgres abstime dates */
}
else
{ /* if (style == USE_POSTGRES_DATES) */
day = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday);
#ifdef DATEDEBUG
printf("EncodeDateTime- day is %d\n", day);
#endif
tm->tm_wday = j2day(day);
strncpy(str, days[tm->tm_wday], 3);
strcpy((str + 3), " ");
if (EuroDates)
{
sprintf((str + 4), "%02d %3s", tm->tm_mday, months[tm->tm_mon - 1]);
}
else
{
sprintf((str + 4), "%3s %02d", months[tm->tm_mon - 1], tm->tm_mday);
}
if (tm->tm_year > 0)
{
sprintf((str + 10), " %02d:%02d", tm->tm_hour, tm->tm_min);
if (fsec != 0)
{
sprintf((str + 16), ":%05.2f %04d", sec, tm->tm_year);
if ((*tzn != NULL) && (tm->tm_isdst >= 0))
{
strcpy((str + 27), " ");
strcpy((str + 28), *tzn);
}
}
else
{
sprintf((str + 16), ":%02.0f %04d", sec, tm->tm_year);
if ((*tzn != NULL) && (tm->tm_isdst >= 0))
{
strcpy((str + 24), " ");
strcpy((str + 25), *tzn);
}
}
}
else
{
sprintf((str + 10), " %02d:%02d %04d %s",
tm->tm_hour, tm->tm_min, -(tm->tm_year - 1), "BC"); tm->tm_hour, tm->tm_min, -(tm->tm_year - 1), "BC");
} }
break;
} }
#ifdef DATEDEBUG #ifdef DATEDEBUG