https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110719
Bug ID: 110719 Summary: Should chrono formatters always use std::time_put for locale's representation? Product: gcc Version: 13.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- auto t = std::chrono::system_clock::now(); auto loc = std::locale::classic(); std::cout << std::format(loc, "{:%EX %OS}\n", t); This prints something like: 14:30:46.809059031 46 The %EX output is produced by calling std::format again with a format string based on the locale's D_FMT, which for the C locale is something like: %H:%M:%S. And using std::format("{:%H:%M:%S}", t) prints fractional seconds for the %S part. The %OS output is produced by calling std::time_put::put with the %OS format string and a struct tm with tm_sec set to the integer number of seconds. This doesn't print the fractional part. If chrono::parse("%EX", t) uses std::time_get then this presents a problem for round-tripping, as the formatted output will have fractional seconds, but the parsed input will not consume that fractional part. Should we consistently use std::time_put for all locale-specific output? Alternatively, we could use time_point_cast and duration_cast to round to seconds. None of the locale-specific formats print fractional seconds. It would be useful to profile std::format with and without std::time_get, to see if reusing std::format performs better. If it doesn't, using std::time_put might be simpler.