Fri 21 Mar 2008 03:24:09 PM UTC, comment #1:
Yes, the %AX problem is indeed a bug, and thanks for letting us know about it.
%AX uses the strftime format %X. That yields the locale's preferred time representation:-
$ for locale in POSIX fr_FR.UTF-8 en_IE.UTF-8 en_US.UTF-8; do printf "%-13s [%s]\n" "$locale" "$(LC_ALL=$locale date +%X)"; done
POSIX [14:31:09]
fr_FR.UTF-8 [14:31:09]
en_IE.UTF-8 [14:31:09]
en_US.UTF-8 [02:31:09 PM]
It looks like the en_US.UTF-8 locale uses the %r format for strftime's %X format. POSIX allows us to determine what format is being used by calling nl_langinfo():
$ LC_ALL=en_US.UTF-8 ./locale_time_formats
POSIX locale:
D_T_FMT : [%a %b %e %H:%M:%S %Y]
D_FMT : [%m/%d/%y]
T_FMT : [%H:%M:%S]
en_US.UTF-8 locale:
D_T_FMT : [%a %d %b %Y %r %Z]
D_FMT : [%m/%d/%Y]
T_FMT : [%r]
On the other hand my locale has T_FMT=%T. It should be safe to append nanoseconds for formats where T_FMT yields just %S (won't happen), %T, or %s (also won't happen), or where the format ends in %S.
If we know the locale is POSIX, we could manually translate %r to
%I:%M:%S %p so that the %S expands correctly, and we can probably do that in all cases for %T.
However, there is another likely bug in the implementation. It hard-codes the use of "." as the radix character instead of using the value of RADIXCHAR.
However, these things would be hard to document. How about doing things this way:
1. In the POSIX locale, the seconds field always includes a fractional part, for all formats.
2. In locales other than POSIX, the only fields for which find will include nanoseconds are %[ACT]S, %[ACT}+, %[ACT]@ and %[ACT]T, and in those cases the locale's radix character will separate the whole part and the fractional part. In locales where the strftime formats %X and %T are identical, this will also happen for %[ACT]X. (Here, "%[ACT]X" means "%AX, %CX or %TX").
3. In other cases the seconds field may lack a fractional part.
In terms of what will change with respect to 4.4.0:
a) No change in the POSIX locale
b) Change in behaviour of %AX, %CX, %TX for non-POSIX locales.
c) Use of radix character where appropriate, versus "." previously.
The upside of this approach is that it is relatively easy to document and the behavioural change is small.
A down-side is that it makes it hard for scripts to consume the output of %[ACT]X. On the other hand, that output is already hard to consume since it has a bug in the 4.4.0 release, and in any case it is probably better to specify "%AT %Ap" if that is what you actually want, rather than "%AX".
|