Hi Bruno,
Collin Funk <[email protected]> writes:
> The issue is that they return the non-C locale date. The code we use
> when --iso-8601 or --rfc-3339 is in use is the following:
>
> if (use_c_locale)
> setlocale (LC_TIME, "C");
>
> bool ok = show_date (format, when, tz);
>
> I wonder if the issue is the cached_localename in
> gl_locale_name_posix_unsafe of Gnulib's lib/localename-unsafe.c. Maybe
> it causes strftime to read the old locale when setlocale (LC_TIME, "C")
> was called.
>
> Hopefully I can debug this on the cfarm machine.
Seems like I was onto something here. Unfortunately, it seems that you
need some special permissions on MacOS to use lldb, so I cannot use it
on cfarm104.
However, I think some printf debugging will work fine to demonstrate. I
created a Coreutils tarball with the following Gnulib patch:
diff --git a/lib/strftime.c b/lib/strftime.c
index 6495a6847e..750b4ccd8a 100644
--- a/lib/strftime.c
+++ b/lib/strftime.c
@@ -111,6 +111,7 @@
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
+#include <stdio.h>
#if (defined __NetBSD__ || defined __sun) && REQUIRE_GNUISH_STRFTIME_AM_PM
# include "localename.h"
@@ -1118,6 +1119,7 @@ my_strftime (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t
maxsize)
if (strcmp (locale_charset (), "UTF-8") == 0)
{
const char *loc = gl_locale_name_unsafe (LC_TIME, "LC_TIME");
+ printf ("%s\n", loc);
if (strlen (loc) >= 5 && !(loc[5] >= 'A' && loc[5] <= 'Z'))
{
if (memcmp (loc, "th_TH", 5) == 0)
Here is two example runs on GNU/Linux to demonstrate the correct
behavior:
$ LC_ALL=am_ET.UTF-8 ./src/date
am_ET.UTF-8
ሰኞ፣ ሐምሌ 21 ቀን 7:12:26 ከሰዓት PDT 2017 ዓ/ም
$ LC_ALL=am_ET.UTF-8 ./src/date --iso-8601
C
2025-07-28
Then on MacOS 12.6 (cfarm104) which is the incorrect behavior:
$ LC_ALL=am_ET.UTF-8 ./src/date
am_ET.UTF-8
ሰኞ ሐም 21 21:14:24 CDT 2017
$ LC_ALL=am_ET.UTF-8 ./src/date --iso-8601
am_ET.UTF-8
2017-11-21
It looks like the issue here is that Apple's CoreFoundation locale
functionality only cares about LC_ALL. Since changing the code I sent my
previous message to:
if (use_c_locale)
setlocale (LC_ALL, "C");
bool ok = show_date (format, when, tz);
Will emit:
$ LC_ALL=am_ET.UTF-8 ./src/date --iso-8601
2025-07-28
But doing that seems unfortunate since error messages from show_date
will now be printed in English, when that is not wanted...
Collin