2010-03-24 33 views
10

Tôi có thể xuất ra định dạng thời gian nhạy cảm miền địa phương bằng cách sử dụng strftime('%X'), nhưng điều này luôn bao gồm giây. Làm thế nào tôi có thể hiển thị định dạng thời gian này mà không cần giây?Cách hiển thị định dạng thời gian nhạy cảm miền địa phương mà không cần giây trong 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秒 

Cách duy nhất tôi có thể nghĩ để làm điều này đang nỗ lực để phân tích đầu ra của locale.nl_langinfo(locale.T_FMT) và loại bỏ các bit giây, nhưng đó sẽ đem lại đó là thủ đoạn gian trá riêng.

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

Giải pháp: (. Dựa trên câu trả lời pixelbeat của)

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

Cách sử dụng:

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

Trả lời

4

tôi sẽ đề nghị vỏ đặc biệt T_FMT trở vì có aren mà nhiều người để xem xét reall 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" là một tab, do đó, rõ ràng là một lỗi. Tôi cho rằng nó phải là "% T" –

3

Đây là giải pháp tồi. Điều gì sẽ xảy ra với một số ngôn ngữ khác nhau mới?

Sử dụng sau:

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

Bây giờ mỗi phiên dịch cho mỗi ngôn ngữ sẽ cung cấp định dạng phù hợp cho từng chuỗi, cho en_US nó sẽ là '%I:M %p', ví zh_tw: %H時%M分

Đây là cách thường các vấn đề về thiếu tài nguyên trong các công cụ bản địa hóa chuẩn được giải quyết.

+0

Có đây là giải pháp chung nhất, nhưng cũng bổ sung thêm nhiều công việc cho các dịch giả, đặc biệt là xem xét chúng sẽ cần tìm kiếm các định dạng strftime. Tài nguyên "H: M" bị thiếu nhưng tôi nghĩ nó khá hợp lý khi suy ra nó từ tài nguyên "H: M: S" xem xét các địa điểm (định dạng) không thường xuyên mới được thêm vào. – pixelbeat

0

Thư viện Babel cung cấp giải pháp dễ dàng và đáng tin cậy cho sự cố này. Đây là mã mẫu sử dụng 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

Xem xét ICU và 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

Mặc dù mã của bạn có thể tự giải thích, câu trả lời của bạn sẽ được cải thiện bằng cách thêm các giải thích ngắn gọn và đơn giản về từng bước của mã; điều này giúp người đọc có thể không quen thuộc với các thư viện bạn đang sử dụng. Chúc may mắn về câu trả lời SO trong tương lai của bạn! – ContinuousLoad

Các vấn đề liên quan