Thanks for the idea...I came up with a macro that mimics with-locale-environment (because it is heavily based on it):
(defmacro with-time-locale (locale-name &rest body)
(declare (indent 1) (debug (sexp def-body)))
(let ((current (gensym)))
`(let ((,current system-time-locale))
(unwind-protect
(progn
(setq system-time-locale ,locale-name)
,@body)
(setq system-time-locale ,current)))))
With a quick test that seems to produce what I want:
(with-time-locale "C"
(message (format "%s -> %s" system-time-locale (format-time-string "%d %b %Y"))))
(with-time-locale "it_IT.UTF8"
(message (format "%s -> %s" system-time-locale (format-time-string "%d %b %Y"))))
(message (format "%s -> %s" system-time-locale (format-time-string "%d %b %Y")))
And no flickers...