2010-03-24 9 views
10

Mogę wydrukować format czasu zależny od ustawień narodowych za pomocą strftime('%X'), ale zawsze zawiera on sekundy. Jak mogę wyświetlić ten format czasu bez sekund?Jak wyświetlić format czasu zależny od ustawień regionalnych bez sekund w pythoniu

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

Jedynym sposobem mogę myśleć w ten sposób stara się analizować dane wyjściowe locale.nl_langinfo(locale.T_FMT) i rozebrać się bitu sekund, ale to przynosi swoje własne oszustwo.

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

Rozwiązanie: (. Na podstawie odpowiedzi pixelbeat za)

# -*- 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) 

Zastosowanie:

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

Odpowiedz

4

Proponuję specjalnej obudowie wracającą T_FMT jak tam aren T tak wiele do rozważenia 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" to zakładka, więc oczywiście błąd. Zakładam, że powinno to być "% T" –

3

To jest złe rozwiązanie. Co dzieje się z nowymi, różnymi lokalizacjami?

Użyj następujących:

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

Teraz każdy tłumacz dla każdego językach zapewni odpowiedni format dla każdej struny, dla en_US byłoby '%I:M %p' dla zh_TW: %H時%M分

To jest jak zwykle problemy z brakującym zasobem w standardowych narzędziach lokalizacyjnych są rozwiązywane.

+0

Tak, to jest najbardziej ogólne rozwiązanie, ale także dodaje więcej pracy dla tłumaczy, szczególnie biorąc pod uwagę, że będą musieli sprawdzić formaty strftime. Brakuje zasobu "H: M", ale uważam, że rozsądnie jest wywnioskować go z zasobu "H: M: S", biorąc pod uwagę, jak rzadko dodawane są nowe ustawienia regionalne (formaty). – pixelbeat

0

Biblioteka Babel zapewnia łatwe i niezawodne rozwiązanie tego problemu. Oto przykładowy kod wykorzystujący 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

Rozważ OIOM i PYTAN.

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

Chociaż twój kod może być oczywisty, twoja odpowiedź zostałaby poprawiona poprzez dodanie krótkich i prostych wyjaśnień na temat tego, co robi każdy krok kodu; pomaga to czytelnikom, którzy mogą nie znać bibliotek, z których korzystasz. Życzymy powodzenia w przyszłości! – ContinuousLoad