2010-03-24 50 views
10

我可以使用strftime('%X')输出区域设置敏感的时间格式,但这总是包含秒。我该如何显示这种时间格式而不用秒?如何在python中显示语言环境敏感的时间格式(无秒)

>>> 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

我建议特殊外壳返回T_FMT因为AREN那么多人考虑回去y:

$ 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 " 
+0

t_fmt =“%t”是一个选项卡,显然是一个错误。我认为它应该是“%T” – 2010-03-24 15:50:03

3

这是不好的解决方案。一些新的不同区域会发生什么?

使用下列内容:

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

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

这是怎么一般解决了标准本地化工具中缺少资源的问题。

+0

是的,这是最通用的解决方案,但也为翻译人员增加了更多工作,特别是考虑到他们需要查看strftime格式。 “H:M”资源缺失,但我认为从“H:M:S”资源中推断它是相当明智的,因为考虑到新增的区域设置(格式)的频繁程度。 – pixelbeat 2010-04-06 10:15:56

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 
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.' 
+0

虽然您的代码可能不言自明,但您可以通过对代码的每个步骤所做的简短解释加以改进;这有助于读者可能不熟悉你正在使用的库。祝你未来好运! – ContinuousLoad 2017-10-03 23:52:25

相关问题