https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117214

--- Comment #2 from XU Kailiang <xu2k3l4 at outlook dot com> ---
Is this patch usable? Steps to setup struct tm are copied from other functions
in chrono_io.h. Hope I didn't get them wrong.

--- a/libstdc++-v3/include/bits/chrono_io.h
+++ b/libstdc++-v3/include/bits/chrono_io.h
@@ -787,27 +787,30 @@ namespace __format

       template<typename _Tp, typename _FormatContext>
        typename _FormatContext::iterator
-       _M_c(const _Tp& __tt, typename _FormatContext::iterator __out,
+       _M_c(const _Tp& __t, typename _FormatContext::iterator __out,
             _FormatContext& __ctx, bool __mod = false) const
        {
          // %c  Locale's date and time representation.
          // %Ec Locale's alternate date and time representation.

-         basic_string<_CharT> __fmt;
-         auto __t = _S_floor_seconds(__tt);
-         locale __loc = _M_locale(__ctx);
-         const auto& __tp = use_facet<__timepunct<_CharT>>(__loc);
-         const _CharT* __formats[2];
-         __tp._M_date_time_formats(__formats);
-         if (*__formats[__mod]) [[likely]]
-           {
-             __fmt = _GLIBCXX_WIDEN("{:L}");
-             __fmt.insert(3u, __formats[__mod]);
-           }
-         else
-           __fmt = _GLIBCXX_WIDEN("{:L%a %b %e %T %Y}");
-         return std::vformat_to(std::move(__out), __loc, __fmt,
-                                std::make_format_args<_FormatContext>(__t));
+         using namespace chrono;
+         auto __d = _S_days(__t);
+         using _TDays = decltype(__d);
+         const auto __ymd = _S_date(__d);
+         const auto __y = __ymd.year();
+         const auto __hms = _S_hms(__t);
+
+         struct tm __tm{};
+         __tm.tm_year = (int)__y - 1900;
+         __tm.tm_yday = (__d - _TDays(__y/January/1)).count();
+         __tm.tm_mon = (unsigned)_S_month(__t) - 1;
+         __tm.tm_mday = (unsigned)_S_day(__t);
+         __tm.tm_wday = _S_weekday(__t).c_encoding();
+         __tm.tm_hour = __hms.hours().count();
+         __tm.tm_min = __hms.minutes().count();
+         __tm.tm_sec = __hms.seconds().count();
+         return _M_locale_fmt(std::move(__out), _M_locale(__ctx), __tm, 'c',
+                              __mod ? 'E' : '\0');
        }

       template<typename _Tp, typename _FormatContext>

Reply via email to