Strftime's %C and %y formats versus wide-ranging tm_year values
The current standard calls for strftime to produce these results: %C: Replaced by the year divided by 100 and truncated to an integer, as a decimal number [00,99]. %y: Replaced by the last two digits of the year as a decimal number [00,99]. The standard is fine where time_t values are 32 bits and the tm_year values associated with these time_t values are always positive, four-digit integers. We're now trying to cope with systems using 64-bit time_t values; the associated time_t values are much wider ranging. Below is a table with suggested %C and %y outputs for wide-ranging years. Note that: 1. %y is always in the range [00,99]. 2. %C is in the range [00,99] whenever possible. 3. %C is two characters long whenever possible. 4. Using the format "%C%y" produces the year in all cases (with leading zeroes in some cases). Is there a better solution? --ado tm_year %C %y ... 10001 100 01 10000 100 00 9999 99 99 ... 1001 10 01 1000 10 00 999 09 99 ... 101 01 01 100 01 00 99 00 99 ... 11 00 11 10 00 10 9 00 09 ... 1 00 01 0 00 00 -1 -0 01 ... -9 -0 09 -10 -0 10 -11 -0 11 ... -99 -0 99 -100 -1 00 -101 -1 01 ... -999 -9 99 -1000 -10 00 -1001 -10 01 ... -9999 -99 99 -10000 -100 00 -10001 -100 01 ...
"Olson, Arthur David (NIH/NCI)" <olsona@dc37a.nci.nih.gov> writes:
4. Using the format "%C%y" produces the year in all cases (with leading zeroes in some cases).
That is a very nice property, one I hadn't seen or thought of before. Good work! I can't think of any way to improve on that approach.
tm_year %C %y ... 0 00 00 -1 -0 01 ... -100 -1 00 ... -1000 -10 00
One very small point: tm_year is actually the year minus 1900, so the header for column 1 should be "Gregorian year" or just plain "year".
participants (2)
-
Olson, Arthur David (NIH/NCI) -
Paul Eggert