https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117085
Bug ID: 117085 Summary: chrono formatting: %c does not honor locale after expansion Product: gcc Version: 14.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: xu2k3l4 at outlook dot com Target Milestone: --- ## issue description how to reproduce: ```cpp #include <chrono> #include <locale> #include <print> constexpr const char *localename = "zh_CN.UTF-8"; int main() { std::locale locale(localename); std::locale::global(locale); auto timepoint = std::chrono::system_clock::from_time_t(0); std::println("{:L%c}", timepoint); } ``` output (x86_64-pc-linux-gnu gcc 14.2.0), note that "Thursday" is not localized: ```plaintext 1970年01月01日 Thursday 00时00分00秒 ``` expected output, i.e. `TZ= LANG=zh_CN.UTF-8 date +'%c' --date='@0'` produces: ```plaintext 1970年01月01日 星期四 00时00分00秒 ``` (same issue exists for many other locales, like fr_FR outputting "Thu 01 Jan 1970 00:00:00" instead of expected "jeu. 01 janv. 1970 00:00:00") ## analysis `__formatter_chrono::_M_c` passes local time format ("%Y年%m月%d日 %A %H时%M分%S秒" for zh_CN) to sub-`vformat_to`, but without "L" format specifier the sub-`vformat_to` will not format the "%A" with requested locale. code link: `__formatter_chrono::_M_c` construction of format string. https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=libstdc%2B%2B-v3/include/bits/chrono_io.h;h=652e88ffe3abbfa78b769c70c3efbae9207a9804;hb=HEAD#l904 ## possible solution in `__formatter_chrono::_M_c`, `__fmt.insert` 'L' if needed.