如何在Python中显示不带秒的区域敏感时间格式
我可以使用 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)
的输出,然后去掉秒数部分,不过这样做也会有一些麻烦。
>>> 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分
4 个回答
2
考虑一下ICU和pyICU。
>>> from icu import *
>>> locale = Locale('en_US')
>>> dtpg = DateTimePatternGenerator.createInstance(locale)
>>> pattern = dtpg.getBestPattern('hm a')
>>> sdf = SimpleDateFormat(pattern, locale)
>>> sdf.format(1507059935.0)
u'12:34 PM'
>>> locale = Locale('de_DE')
>>> dtpg = DateTimePatternGenerator.createInstance(locale)
>>> pattern = dtpg.getBestPattern('hm a')
>>> sdf = SimpleDateFormat(pattern, locale)
>>> sdf.format(1507059935.0)
u'12:34 nachm.'
3
这个解决方案不好。如果有新的不同地区的设置会发生什么呢?
可以使用以下方法:
t.strftime(gettext('%H:%M'))
现在每个语言的翻译者都会为每个字符串提供合适的格式,比如对于en_US
(美国英语)来说,格式是'%I:M %p
',而对于zh_TW(繁体中文)来说,格式是%H時%M分
。
这就是通常在标准本地化工具中解决缺少资源问题的方法。
4
我建议对返回的 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 "