Tim*_*ten 12 python format time locale
我可以使用输出区域敏感时间格式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?
Run Code Online (Sandbox Code Playgroud)
我能想到这样做的唯一方法是尝试解析输出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
Run Code Online (Sandbox Code Playgroud)
(根据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)
Run Code Online (Sandbox Code Playgroud)
用法:
>>> 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?
Run Code Online (Sandbox Code Playgroud)
我建议对返回的 T_FMT 进行特殊封装,因为实际上没有那么多需要考虑:
\n\n$ for l in $(locale -a | grep utf8); do locale | cut -d= -f1 | LANG=$l xargs locale -kc | grep ^t_fmt=; done | sort -u\n\nt_fmt="%H:%M:%S"\nt_fmt="%H.%M.%S"\nt_fmt="%H\xec\x8b\x9c %M\xeb\xb6\x84 %S\xec\xb4\x88"\nt_fmt="\xe0\xbd\x86\xe0\xbd\xb4\xe0\xbc\x8b\xe0\xbd\x9a\xe0\xbd\xbc\xe0\xbd\x91%H\xe0\xbd\x80\xe0\xbd\xa6\xe0\xbd\xa2\xe0\xbc\x8b\xe0\xbd\x98%M\xe0\xbd\x80\xe0\xbd\xa6\xe0\xbd\xa2\xe0\xbc\x8b\xe0\xbd\x86%S"\nt_fmt="%H\xe6\x97\xb6%M\xe5\x88\x86%S\xe7\xa7\x92"\nt_fmt="%H\xe6\x97\xb6%M\xe5\x88\x86%S\xe7\xa7\x92 %Z"\nt_fmt="%H\xe6\x99\x82%M\xe5\x88\x86%S\xe7\xa7\x92"\nt_fmt="%I.%M.%S %p"\nt_fmt="%I:%M:%S %Z"\nt_fmt="%I:%M:%S %Z"\nt_fmt="%I.%M.%S. %Z"\nt_fmt="%I\xe6\x99\x82%M\xe5\x88\x86%S\xe7\xa7\x92 %Z"\nt_fmt="kl. %H.%M %z"\nt_fmt="%k,%M,%S"\nt_fmt="%k:%M:%S"\nt_fmt="%l:%M:%S"\nt_fmt="%OH:%OM:%OS"\nt_fmt="%OI:%OM:%OS %p"\nt_fmt="%p%I.%M.%S %Z"\nt_fmt="%r"\nt_fmt="%t"\nt_fmt="%T"\nt_fmt="%Z %I:%M:%S "\nRun Code Online (Sandbox Code Playgroud)\n