Created on 2019-09-02.00:00:00 last changed 56 months ago
Proposed resolution:
This wording is relative to N4830.
Modify [time.format] as indicated:
-3- Unless explicitly requested, the result of formatting a chrono type does not contain time zone abbreviation and time zone offset information. If the information is available, the conversion specifiers %Z and %z will format this information (respectively). [Note: If the information is not available and a %Z or %z conversion specifier appears in the chrono-format-spec, an exception of type format_error is thrown, as described above. — end note]
-?- If the type being formatted does not contain the information that the format flag needs, an exception of type format_error is thrown. [Example: A duration does not contain enough information to format as a weekday — end example]. However if a flag refers to a "time of day" (e.g. %H, %I, %p, etc.), then a specialization of duration is interpreted as the time of day elapsed since midnight.
Modify [time.parse] as indicated:
[Drafting note: The modification of [time.parse] p1 is intended to be non-conflictingly mergeable with the change suggested by LWG 3269 and LWG 3271 at the same paragraph.]
-1- Each parse overload specified in this subclause calls from_stream unqualified, so as to enable argument dependent lookup ([basic.lookup.argdep]). In the following paragraphs, let is denote an object of type basic_istream<charT, traits>, where charT and traits are template parameters in that context.
[…] -10- All from_stream overloads behave as unformatted input functions, except that they have an unspecified effect on the value returned by subsequent calls to basic_istream<>::gcount(). Each overload takes a format string containing ordinary characters and flags which have special meaning. Each flag begins with a %. Some flags can be modified by E or O. During parsing each flag interprets characters as parts of date and time types according to Table [tab:time.parse.spec]. Some flags can be modified by a width parameter given as a positive decimal integer called out as N below which governs how many characters are parsed from the stream in interpreting the flag. All characters in the format string that are not represented in Table [tab:time.parse.spec], except for white space, are parsed unchanged from the stream. A white space character matches zero or more white space characters in the input stream. -?- If the type being parsed can not represent the information that the format flag refers to, is.setstate(ios_base::failbit) is called. [Example: A duration cannot represent a weekday — end example]. However if a flag refers to a "time of day" (e.g. %H, %I, %p, etc.), then a specialization of duration is parsed as the time of day elapsed since midnight.
[ 2019-10 Status set to 'Tentatively Ready' after reflector discussion ]
It is clear how "%I%p" parses and formats time points. What is not clear is how these flags interact with durations. We should treat durations as "elapsed time since midnight". For example:
#include <chrono>
#include <iostream>
#include <string>
#include <sstream>
int main()
{
using namespace std;
using namespace std::chrono;
// Format
{
// format time_point with %I%p
cout << format("{:%F %I%p}", sys_days{2019_y/August/10}+14h) << '\n';
}
{
// format duration with %I%p
cout << format("{:%I%p}", 14h) << '\n';
}
// Parse
{
// Parse %I%p as day-of-year combined with an hour into a time_point
istringstream in{"2019-08-10 2pm"};
system_clock::time_point tp;
in >> parse("%F %I%p", tp);
cout << tp << '\n';
}
{
// Parse %I%p as number of hours into a duration
istringstream in{"2pm"};
hours d;
in >> parse("%I%p", d);
cout << d << '\n';
}
}
Output:
2019-08-10 02PM 02PM 2019-08-10 14:00:00.000000 14h
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2021-02-25 10:48:01 | admin | set | status: wp -> c++20 |
| 2019-11-19 14:48:30 | admin | set | status: voting -> wp |
| 2019-10-07 02:48:00 | admin | set | status: ready -> voting |
| 2019-10-07 02:21:30 | admin | set | messages: + msg10679 |
| 2019-10-07 02:21:30 | admin | set | status: new -> ready |
| 2019-09-14 11:32:28 | admin | set | messages: + msg10605 |
| 2019-09-02 00:00:00 | admin | create | |