Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4093838

Browse files
committed
Back-patch fix for AM/PM boundary problem in to_char().
Fix from Karel Zak, 10/18/00.
1 parent1dfc377 commit4093838

File tree

1 file changed

+71
-13
lines changed

1 file changed

+71
-13
lines changed

‎src/backend/utils/adt/formatting.c

Lines changed: 71 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* -----------------------------------------------------------------------
22
* formatting.c
33
*
4-
* $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.8 2000/04/12 17:15:49 momjian Exp $
4+
* $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.8.2.1 2000/10/19 18:39:03 tgl Exp $
55
*
66
*
77
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
@@ -1513,6 +1513,8 @@ dch_global(int arg, char *inout, int suf, int flag, FormatNode *node)
15131513
return-1;
15141514
}
15151515

1516+
#defineAMPM_ERROR elog(ERROR, "to_timestamp(): bad AM/PM string")
1517+
15161518
/* ----------
15171519
* Master function of TIME for:
15181520
* TO_CHAR- write (inout) formated string
@@ -1531,59 +1533,115 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node)
15311533
caseDCH_P_M:
15321534
if (flag==TO_CHAR)
15331535
{
1534-
strcpy(inout, (tm->tm_hour>13 ?P_M_STR :A_M_STR));
1536+
strcpy(inout, ((tm->tm_hour>11
1537+
&&tm->tm_hour<24) ?P_M_STR :A_M_STR));
15351538
return3;
15361539

15371540
}
15381541
elseif (flag==FROM_CHAR)
15391542
{
1540-
if (strncmp(inout,P_M_STR,4)==0&&tm->tm_hour<13)
1541-
tm->tm_hour+=12;
1543+
if (tm->tm_hour<1||tm->tm_hour>12)
1544+
elog(ERROR,"to_timestamp(): AM/PM hour must be between 1 and 12");
1545+
1546+
if (strncmp(inout,P_M_STR,4)==0)
1547+
{
1548+
if (tm->tm_hour<12)
1549+
tm->tm_hour+=12;
1550+
}
1551+
elseif (strncmp(inout,A_M_STR,4)==0)
1552+
{
1553+
if (tm->tm_hour==12)
1554+
tm->tm_hour=0;
1555+
}
1556+
else
1557+
AMPM_ERROR;
15421558
return3;
15431559
}
15441560

15451561
caseDCH_AM:
15461562
caseDCH_PM:
15471563
if (flag==TO_CHAR)
15481564
{
1549-
strcpy(inout, (tm->tm_hour>13 ?PM_STR :AM_STR));
1565+
strcpy(inout, ((tm->tm_hour>11
1566+
&&tm->tm_hour<24) ?PM_STR :AM_STR));
15501567
return1;
15511568

15521569
}
15531570
elseif (flag==FROM_CHAR)
15541571
{
1555-
if (strncmp(inout,PM_STR,2)==0&&tm->tm_hour<13)
1556-
tm->tm_hour+=12;
1572+
if (tm->tm_hour<1||tm->tm_hour>12)
1573+
elog(ERROR,"to_timestamp(): AM/PM hour must be between 1 and 12");
1574+
1575+
if (strncmp(inout,PM_STR,4)==0)
1576+
{
1577+
if (tm->tm_hour<12)
1578+
tm->tm_hour+=12;
1579+
}
1580+
elseif (strncmp(inout,AM_STR,4)==0)
1581+
{
1582+
if (tm->tm_hour==12)
1583+
tm->tm_hour=0;
1584+
}
1585+
else
1586+
AMPM_ERROR;
15571587
return1;
15581588
}
15591589

15601590
caseDCH_a_m:
15611591
caseDCH_p_m:
15621592
if (flag==TO_CHAR)
15631593
{
1564-
strcpy(inout, (tm->tm_hour>13 ?p_m_STR :a_m_STR));
1594+
strcpy(inout, ((tm->tm_hour>11
1595+
&&tm->tm_hour<24) ?p_m_STR :a_m_STR));
15651596
return3;
15661597

15671598
}
15681599
elseif (flag==FROM_CHAR)
15691600
{
1570-
if (strncmp(inout,p_m_STR,4)==0&&tm->tm_hour<13)
1571-
tm->tm_hour+=12;
1601+
if (tm->tm_hour<1||tm->tm_hour>12)
1602+
elog(ERROR,"to_timestamp(): AM/PM hour must be between 1 and 12");
1603+
1604+
if (strncmp(inout,p_m_STR,4)==0)
1605+
{
1606+
if (tm->tm_hour<12)
1607+
tm->tm_hour+=12;
1608+
}
1609+
elseif (strncmp(inout,a_m_STR,4)==0)
1610+
{
1611+
if (tm->tm_hour==12)
1612+
tm->tm_hour=0;
1613+
}
1614+
else
1615+
AMPM_ERROR;
15721616
return3;
15731617
}
15741618

15751619
caseDCH_am:
15761620
caseDCH_pm:
15771621
if (flag==TO_CHAR)
15781622
{
1579-
strcpy(inout, (tm->tm_hour>13 ?pm_STR :am_STR));
1623+
strcpy(inout, ((tm->tm_hour>11
1624+
&&tm->tm_hour<24) ?pm_STR :am_STR));
15801625
return1;
15811626

15821627
}
15831628
elseif (flag==FROM_CHAR)
15841629
{
1585-
if (strncmp(inout,pm_STR,2)==0&&tm->tm_hour<13)
1586-
tm->tm_hour+=12;
1630+
if (tm->tm_hour<1||tm->tm_hour>12)
1631+
elog(ERROR,"to_timestamp(): AM/PM hour must be between 1 and 12");
1632+
1633+
if (strncmp(inout,pm_STR,4)==0)
1634+
{
1635+
if (tm->tm_hour<12)
1636+
tm->tm_hour+=12;
1637+
}
1638+
elseif (strncmp(inout,am_STR,4)==0)
1639+
{
1640+
if (tm->tm_hour==12)
1641+
tm->tm_hour=0;
1642+
}
1643+
else
1644+
AMPM_ERROR;
15871645
return1;
15881646
}
15891647

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp