我可以使用来输出对语言环境敏感的时间格式strftime('%X'),但这总是包括秒。如何以秒为单位显示此时间格式?
strftime('%X')
>>> import locale >>> import datetime >>> locale.setlocale(locale.LC_ALL, 'en_IE.utf-8') 'en_IE.utf-8' >>> print datetime.datetime.now().strftime('%X') 12:22:43 >>> locale.setlocale(locale.LC_ALL, 'zh_TW.utf-8') 'zh_TW.utf-8' >>> print datetime.datetime.now().strftime('%X') 12時22分58秒
我能想到的唯一方法是尝试解析输出locale.nl_langinfo(locale.T_FMT)并去除秒位,但这带来了麻烦。
locale.nl_langinfo(locale.T_FMT)
>>> print locale.nl_langinfo(locale.T_FMT) %H時%M分%S秒 >>> locale.setlocale(locale.LC_ALL, 'en_IE.utf-8') 'en_IE.utf-8' >>> print locale.nl_langinfo(locale.T_FMT) %T
(基于pixelbeat的答案。)
# -*- coding: utf-8 -*- import locale def locale_time(t, show_seconds=False): if show_seconds: return t.strftime('%X') replacement_fmts = [ (u'.%S', u''), (u':%S', u''), (u',%S', u''), (u':%OS', ''), (u'ཀསར་ཆ%S', u''), (u' %S초', u''), (u'%S秒', u''), (u'%r', '%I:%M %p'), (u'%t', '%H:%M'), (u'%T', '%H:%M') ] enc=locale.getpreferredencoding(do_setlocale=False) t_fmt = locale.nl_langinfo(locale.T_FMT).decode(enc) for fmt in replacement_fmts: new_t_fmt = t_fmt.replace(*fmt) if new_t_fmt != t_fmt: return t.strftime(new_t_fmt.encode(enc)) return t.strftime(t_fmt.encode(enc)
用法:
>>> locale.setlocale(locale.LC_ALL, 'en_IE.utf-8') 'en_IE.utf-8' >>> print locale_time(t) 15:47 >>> locale.setlocale(locale.LC_ALL, 'zh_TW.utf-8') 'zh_TW.utf-8' >>> print locale_time(t) 15時47分
我建议对返回的T_FMT使用特殊大小写,因为实际上没有太多要考虑的内容:
$ for l in $(locale -a | grep utf8); do locale | cut -d= -f1 | LANG=$l xargs locale -kc | grep ^t_fmt=; done | sort -u t_fmt="%H:%M:%S" t_fmt="%H.%M.%S" t_fmt="%H시 %M분 %S초" t_fmt="ཆུ་ཚོད%Hཀསར་མ%Mཀསར་ཆ%S" t_fmt="%H时%M分%S秒" t_fmt="%H时%M分%S秒 %Z" t_fmt="%H時%M分%S秒" t_fmt="%I.%M.%S %p" t_fmt="%I:%M:%S %Z" t_fmt="%I:%M:%S %Z" t_fmt="%I.%M.%S. %Z" t_fmt="%I時%M分%S秒 %Z" t_fmt="kl. %H.%M %z" t_fmt="%k,%M,%S" t_fmt="%k:%M:%S" t_fmt="%l:%M:%S" t_fmt="%OH:%OM:%OS" t_fmt="%OI:%OM:%OS %p" t_fmt="%p%I.%M.%S %Z" t_fmt="%r" t_fmt="%t" t_fmt="%T" t_fmt="%Z %I:%M:%S "