strftime.c(__strftime): add %q, %v, tests; tweak %Z doc

%q GNU quarter year 1-4
%v BSD/OSX/Ruby VMS/Oracle %e-%b-%Y
%Z change time zone *name* to *abbreviation*
This commit is contained in:
Brian Inglis 2022-10-21 23:13:52 -06:00 committed by Corinna Vinschen
parent 7f7e4e5bc5
commit 737e2004a3
1 changed files with 55 additions and 3 deletions

View File

@ -161,6 +161,10 @@ the current locale. [tm_hour]
o %P o %P
Same as '<<%p>>', but in lowercase. This is a GNU extension. [tm_hour] Same as '<<%p>>', but in lowercase. This is a GNU extension. [tm_hour]
o %q
Quarter of the year (from `<<1>>' to `<<4>>'), with January starting
the first quarter. This is a GNU extension. [tm_mon]
o %r o %r
Replaced by the time in a.m. and p.m. notation. In the "C" locale this Replaced by the time in a.m. and p.m. notation. In the "C" locale this
is equivalent to "%I:%M:%S %p". In locales which don't define a.m./p.m. is equivalent to "%I:%M:%S %p". In locales which don't define a.m./p.m.
@ -198,6 +202,10 @@ The week number, where weeks start on Monday, week 1 contains January 4th,
and earlier days are in the previous year. Formatted with two digits and earlier days are in the previous year. Formatted with two digits
(from `<<01>>' to `<<53>>'). See also <<%G>>. [tm_year, tm_wday, tm_yday] (from `<<01>>' to `<<53>>'). See also <<%G>>. [tm_year, tm_wday, tm_yday]
o %v
A string representing the BSD/OSX/Ruby VMS/Oracle date format, in the form
"%e-%b-%Y". Non-POSIX extension. [tm_mday, tm_mon, tm_year]
o %w o %w
The weekday as a number, 0-based from Sunday (from `<<0>>' to `<<6>>'). The weekday as a number, 0-based from Sunday (from `<<0>>' to `<<6>>').
[tm_wday] [tm_wday]
@ -235,9 +243,9 @@ savings offset for the current timezone. The offset is determined from
the TZ environment variable, as if by calling tzset(). [tm_isdst] the TZ environment variable, as if by calling tzset(). [tm_isdst]
o %Z o %Z
The time zone name. If tm_isdst is negative, no output is generated. The current time zone abbreviation. If tm_isdst is negative, no output
Otherwise, the time zone name is based on the TZ environment variable, is generated. Otherwise, the time zone abbreviation is based on the TZ
as if by calling tzset(). [tm_isdst] environment variable, as if by calling tzset(). [tm_isdst]
o %% o %%
A single character, `<<%>>'. A single character, `<<%>>'.
@ -1086,6 +1094,11 @@ recurse:
return 0; return 0;
} }
break; break;
case CQ('q'): /* GNU quarter year */
len = snprintf (&s[count], maxsize - count, CQ("%.1d"),
tim_p->tm_mon / 3 + 1);
CHECK_LENGTH ();
break;
case CQ('R'): case CQ('R'):
len = snprintf (&s[count], maxsize - count, CQ("%.2d:%.2d"), len = snprintf (&s[count], maxsize - count, CQ("%.2d:%.2d"),
tim_p->tm_hour, tim_p->tm_min); tim_p->tm_hour, tim_p->tm_min);
@ -1241,6 +1254,37 @@ recurse:
CHECK_LENGTH (); CHECK_LENGTH ();
} }
break; break;
case CQ('v'): /* BSD/OSX/Ruby extension VMS/Oracle date format
from Arnold Robbins strftime version 3.0 */
{ /* %v is equivalent to "%e-%b-%Y", flags and width can change year
format. Recurse to avoid need to replicate %b and %Y formation. */
CHAR fmtbuf[32], *fmt = fmtbuf;
STRCPY (fmt, CQ("%e-%b-%"));
fmt += strlen (fmt);
if (pad) /* '0' or '+' */
*fmt++ = pad;
else
*fmt++ = '+';
if (!pad)
width = 10;
if (width < 6)
width = 6;
width -= 6;
if (width)
{
len = snprintf (fmt, fmtbuf + 32 - fmt, CQ("%lu"), width);
if (len > 0)
fmt += len;
}
STRCPY (fmt, CQ("Y"));
len = __strftime (&s[count], maxsize - count, fmtbuf, tim_p,
locale, era_info, alt_digits);
if (len > 0)
count += len;
else
return 0;
}
break;
case CQ('w'): case CQ('w'):
#ifdef _WANT_C99_TIME_FORMATS #ifdef _WANT_C99_TIME_FORMATS
if (alt == CQ('O') && *alt_digits) if (alt == CQ('O') && *alt_digits)
@ -1531,6 +1575,7 @@ const struct test Vec0[] = {
{ CQ("%M"), 2+1, EXP(CQ("53")) }, { CQ("%M"), 2+1, EXP(CQ("53")) },
{ CQ("%n"), 1+1, EXP(CQ("\n")) }, { CQ("%n"), 1+1, EXP(CQ("\n")) },
{ CQ("%p"), 2+1, EXP(CQ("AM")) }, { CQ("%p"), 2+1, EXP(CQ("AM")) },
{ CQ("%q"), 1+1, EXP(CQ("4")) },
{ CQ("%r"), 11+1, EXP(CQ("09:53:47 AM")) }, { CQ("%r"), 11+1, EXP(CQ("09:53:47 AM")) },
{ CQ("%R"), 5+1, EXP(CQ("09:53")) }, { CQ("%R"), 5+1, EXP(CQ("09:53")) },
{ CQ("%s"), 2+1, EXP(CQ("1230648827")) }, { CQ("%s"), 2+1, EXP(CQ("1230648827")) },
@ -1540,6 +1585,7 @@ const struct test Vec0[] = {
{ CQ("%u"), 1+1, EXP(CQ("2")) }, { CQ("%u"), 1+1, EXP(CQ("2")) },
{ CQ("%U"), 2+1, EXP(CQ("52")) }, { CQ("%U"), 2+1, EXP(CQ("52")) },
{ CQ("%V"), 2+1, EXP(CQ("01")) }, { CQ("%V"), 2+1, EXP(CQ("01")) },
{ CQ("%v"), 11+1, EXP(CQ("30-Dec-2008")) },
{ CQ("%w"), 1+1, EXP(CQ("2")) }, { CQ("%w"), 1+1, EXP(CQ("2")) },
{ CQ("%W"), 2+1, EXP(CQ("52")) }, { CQ("%W"), 2+1, EXP(CQ("52")) },
{ CQ("%x"), 8+1, EXP(CQ("12/30/08")) }, { CQ("%x"), 8+1, EXP(CQ("12/30/08")) },
@ -1592,6 +1638,7 @@ const struct test Vec1[] = {
{ CQ("%M"), 2+1, EXP(CQ("01")) }, { CQ("%M"), 2+1, EXP(CQ("01")) },
{ CQ("%n"), 1+1, EXP(CQ("\n")) }, { CQ("%n"), 1+1, EXP(CQ("\n")) },
{ CQ("%p"), 2+1, EXP(CQ("PM")) }, { CQ("%p"), 2+1, EXP(CQ("PM")) },
{ CQ("%q"), 1+1, EXP(CQ("3")) },
{ CQ("%r"), 11+1, EXP(CQ("11:01:13 PM")) }, { CQ("%r"), 11+1, EXP(CQ("11:01:13 PM")) },
{ CQ("%R"), 5+1, EXP(CQ("23:01")) }, { CQ("%R"), 5+1, EXP(CQ("23:01")) },
{ CQ("%s"), 2+1, EXP(CQ("1215054073")) }, { CQ("%s"), 2+1, EXP(CQ("1215054073")) },
@ -1601,6 +1648,7 @@ const struct test Vec1[] = {
{ CQ("%u"), 1+1, EXP(CQ("3")) }, { CQ("%u"), 1+1, EXP(CQ("3")) },
{ CQ("%U"), 2+1, EXP(CQ("26")) }, { CQ("%U"), 2+1, EXP(CQ("26")) },
{ CQ("%V"), 2+1, EXP(CQ("27")) }, { CQ("%V"), 2+1, EXP(CQ("27")) },
{ CQ("%v"), 11+1, EXP(CQ(" 2-Jul-2008")) },
{ CQ("%w"), 1+1, EXP(CQ("3")) }, { CQ("%w"), 1+1, EXP(CQ("3")) },
{ CQ("%W"), 2+1, EXP(CQ("26")) }, { CQ("%W"), 2+1, EXP(CQ("26")) },
{ CQ("%x"), 8+1, EXP(CQ("07/02/08")) }, { CQ("%x"), 8+1, EXP(CQ("07/02/08")) },
@ -1662,6 +1710,7 @@ const struct test Vecyr0[] = {
{ CQ("%c"), OUTSIZE, EXP(CQ("Wed Jul 2 23:01:13 ")YEAR) }, { CQ("%c"), OUTSIZE, EXP(CQ("Wed Jul 2 23:01:13 ")YEAR) },
{ CQ("%D"), OUTSIZE, EXP(CQ("07/02/")Year) }, { CQ("%D"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%F"), OUTSIZE, EXP(YEAR CQ("-07-02")) }, { CQ("%F"), OUTSIZE, EXP(YEAR CQ("-07-02")) },
{ CQ("%v"), OUTSIZE, EXP(CQ(" 2-Jul-")YEAR) },
{ CQ("%x"), OUTSIZE, EXP(CQ("07/02/")Year) }, { CQ("%x"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%y"), OUTSIZE, EXP(Year) }, { CQ("%y"), OUTSIZE, EXP(Year) },
{ CQ("%Y"), OUTSIZE, EXP(YEAR) }, { CQ("%Y"), OUTSIZE, EXP(YEAR) },
@ -1708,6 +1757,7 @@ const struct test Vecyr1[] = {
{ CQ("%c"), OUTSIZE, EXP(CQ("Wed Jul 2 23:01:13 ")YEAR) }, { CQ("%c"), OUTSIZE, EXP(CQ("Wed Jul 2 23:01:13 ")YEAR) },
{ CQ("%D"), OUTSIZE, EXP(CQ("07/02/")Year) }, { CQ("%D"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%F"), OUTSIZE, EXP(YEAR CQ("-07-02")) }, { CQ("%F"), OUTSIZE, EXP(YEAR CQ("-07-02")) },
{ CQ("%v"), OUTSIZE, EXP(CQ(" 2-Jul-")YEAR) },
{ CQ("%x"), OUTSIZE, EXP(CQ("07/02/")Year) }, { CQ("%x"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%y"), OUTSIZE, EXP(Year) }, { CQ("%y"), OUTSIZE, EXP(Year) },
{ CQ("%Y"), OUTSIZE, EXP(YEAR) }, { CQ("%Y"), OUTSIZE, EXP(YEAR) },
@ -1745,6 +1795,7 @@ const struct test Vecyrzp[] = {
{ CQ("%c"), OUTSIZE, EXP(CQ("Wed Jul 2 23:01:60 ")YEAR) }, { CQ("%c"), OUTSIZE, EXP(CQ("Wed Jul 2 23:01:60 ")YEAR) },
{ CQ("%D"), OUTSIZE, EXP(CQ("07/02/")Year) }, { CQ("%D"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%F"), OUTSIZE, EXP(YEAR CQ("-07-02")) }, { CQ("%F"), OUTSIZE, EXP(YEAR CQ("-07-02")) },
{ CQ("%v"), OUTSIZE, EXP(CQ(" 2-Jul-")YEAR) },
{ CQ("%x"), OUTSIZE, EXP(CQ("07/02/")Year) }, { CQ("%x"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%y"), OUTSIZE, EXP(Year) }, { CQ("%y"), OUTSIZE, EXP(Year) },
{ CQ("%Y"), OUTSIZE, EXP(YEAR) }, { CQ("%Y"), OUTSIZE, EXP(YEAR) },
@ -1780,6 +1831,7 @@ const struct test Vecyrzn[] = {
{ CQ("%c"), OUTSIZE, EXP(CQ("Wed Jul 2 23:01:00 ")YEAR) }, { CQ("%c"), OUTSIZE, EXP(CQ("Wed Jul 2 23:01:00 ")YEAR) },
{ CQ("%D"), OUTSIZE, EXP(CQ("07/02/")Year) }, { CQ("%D"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%F"), OUTSIZE, EXP(YEAR CQ("-07-02")) }, { CQ("%F"), OUTSIZE, EXP(YEAR CQ("-07-02")) },
{ CQ("%v"), OUTSIZE, EXP(CQ(" 2-Jul-")YEAR) },
{ CQ("%x"), OUTSIZE, EXP(CQ("07/02/")Year) }, { CQ("%x"), OUTSIZE, EXP(CQ("07/02/")Year) },
{ CQ("%y"), OUTSIZE, EXP(Year) }, { CQ("%y"), OUTSIZE, EXP(Year) },
{ CQ("%Y"), OUTSIZE, EXP(YEAR) }, { CQ("%Y"), OUTSIZE, EXP(YEAR) },