如何在python中显示没有秒的区域设置敏感时间格式

时间:2010-03-24 12:50:06

标签: python time format 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秒

我能想到这样做的唯一方法是尝试解析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 个答案:

答案 0 :(得分: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 "

答案 1 :(得分:3)

这是一个糟糕的解决方案。一些新的不同语言环境会发生什么?

使用以下内容:

t.strftime(gettext('%H:%M'))

现在,每种语言的每个翻译器都会为每个字符串提供合适的格式 en_US对于zh_TW,它将为“%I:M %p”:%H時%M分

这通常解决了标准本地化工具中缺少资源的问题。

答案 2 :(得分:1)

考虑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 :(得分:0)

Babel库为此问题提供了一种简单可靠的解决方案。以下是使用Python 2的示例代码。

#!/usr/bin/env python2
from datetime import datetime
from babel.dates import format_time

date_time = datetime.now()
formatted_time = format_time(date_time, format='short', locale='en_US')
print formatted_time