Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: can strftime show 'p.m.' instead of 'PM'?

On Sat, 28 Apr 2012, TJ Luoma wrote:

Before I begin, I should say that I realize this may (seem to) be extremely picayune, but it consistently annoys me. Judge me as you will :-)

`man strftime` says this:

    %p    is replaced by national representation of either "ante meridiem" (a.m.)  or "post meridiem" (p.m.)  as appropriate.

    %F    is equivalent to ``%Y-%m-%d''.

    %r    is equivalent to ``%I:%M:%S %p''.

My `man strftime` lists:

%p Either "AM" or "PM" according to the given time value, or the corresponding strings for the current locale. Noon is treated as "PM" and midnight as "AM".

%P Like %p but in lowercase: "am" or "pm" or a corresponding string for the current locale. (GNU)

AFAIK, the strftime provided by zsh/datetime just passes its format string to the C library function. (So, right now, %p and %P get me 'PM' and 'pm', respectively.)

However when I do this in zsh

$ strftime "%F %r" "$EPOCHSECONDS"

I get this:

2012-04-28 02:50:24 PM

Ideally I would like "PM" to be "p.m." but I'd probably settle for "pm"

I tried using '%P' instead of '%p' (thinking that might invert the case) but that just gave me a literal 'P' instead.

I realize that I could use:

strftime "%F %r" "$EPOCHSECONDS" | tr '[A-Z]' '[a-z]'

or even

strftime "%F %r" "$EPOCHSECONDS" | sed 's#AM#a.m#g; s#pPM#p.m.#g'

but I wondered if there was a better (more efficient) way.

Since it's system-dependent, you're probably better off munging it yourself. But if you're extremely worried about efficiency, you don't need to pipe to `tr` or `sed` (so you can avoid launching an external process):

print -r - ${${${:-"$(strftime "%F %r" "$EPOCHSECONDS")"}/AM/a.m.}/PM/p.m.}


Messages sorted by: Reverse Date, Date, Thread, Author