This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++20 status.

### 3270. Parsing and formatting `%j` with `duration`s

Section: 29.12 [time.format], 29.13 [time.parse] Status: C++20 Submitter: Howard Hinnant Opened: 2019-09-02 Last modified: 2021-02-25

Priority: 2

View other active issues in [time.format].

View all other issues in [time.format].

View all issues with C++20 status.

Discussion:

`%j` represents the day number of the year when formatting and parsing `time_point`s. It is also handy to interpret this flag consistently when formatting and parsing durations. That is if there is not enough information in the stream to represent a `time_point`, and if the target of the format/parse is a `duration`, `%j` represents a number of days.

>     #include <chrono>
>     #include <iostream>
>     #include <sstream>
>     #include <string>

>     int main()
>     {
>       using namespace std;
>       using namespace std::chrono;
>       // Parse %j as number of days into a duration
>       istringstream in{"222"};
>       hours d;
>       in >> parse("%j", d);
>       cout << d << '\n';
>       cout << format("{:%j}", d) << '\n';
>     }

Output:

>     5328h
>     222

[2019-10 Priority set to 2 after reflector discussion]

Previous resolution [SUPERSEDED]:

> This wording is relative to N4830.

> 1. Modify "Table 98 — Meaning of conversion specifiers" [tab:time.format.spec] as indicated:

>    > Table 98 — Meaning of conversion specifiers [tab:time.format.spec]
>    > Specifier | Replacement
>    > --- | ---
>    > `[…]`
>    > `%j` | The day of the year as a decimal number. Jan 1 is `001`. If the result is less than three digits, it is left-padded with `0` to three digits. If the type being formatted is a specialization of `duration`, it is formatted as a decimal number of `days`.
>    > `[…]`

> 2. Modify "Table 99 — Meaning of `parse` flags" [tab:time.parse.spec] as indicated:

>    > Table 99 — Meaning of `parse` flags [tab:time.parse.spec]
>    > Flag | Parsed value
>    > --- | ---
>    > `[…]`
>    > `%j` | The day of the year as a decimal number. Jan 1 is `1`. The modified command `%Nj` specifies the maximum number of characters to read. If `N` is not specified, the default is `3`. Leading zeroes are permitted but not required. If the type being parsed is a specialization of `duration`, it is parsed as a decimal number of `days`.
>    > `[…]`

[2020-02-13 After Thursday afternoon discussion in Prague, Marshall provides updated wording.]

[2020-02 Status to Immediate on Thursday night in Prague.]

Proposed resolution:

This wording is relative to N4830.

1. Modify "Table 98 — Meaning of conversion specifiers" [tab:time.format.spec] as indicated:

   > Table 98 — Meaning of conversion specifiers [tab:time.format.spec]
   > Specifier | Replacement
   > --- | ---
   > `[…]`
   > `%j` | If the type being formatted is a specialization of `duration`, the decimal number of `days` without padding. Otherwise, the The day of the year as a decimal number. Jan 1 is `001`. If the result is less than three digits, it is left-padded with `0` to three digits.
   > `[…]`

2. Modify "Table 99 — Meaning of `parse` flags" [tab:time.parse.spec] as indicated:

   > Table 99 — Meaning of `parse` flags [tab:time.parse.spec]
   > Flag | Parsed value
   > --- | ---
   > `[…]`
   > `%j` | If the type being parsed is a specialization of `duration`, a decimal number of `days`. Otherwise, the The day of the year as a decimal number. Jan 1 is `1`. In either case, the The modified command `%Nj` specifies the maximum number of characters to read. If `N` is not specified, the default is `3`. Leading zeroes are permitted but not required.
   > `[…]`