当前位置: 首页 > 面试题库 >

如何在python中不显示秒的情况下显示语言环境敏感的时间格式

锺离森
2023-03-14
问题内容

我可以使用来输出对语言环境敏感的时间格式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分

问题答案:

我建议对返回的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 "


 类似资料:
  • 问题内容: 在我的应用中,我需要以对语言环境敏感的方式显示日期。因此,“ 2018年5月10日星期四”应按原样显示在en_US中,但应显示为“ 2018年5月10日星期四”在en_GB中(英国英文)。 在大多数情况下,我可以将以下样式的代码与java.time API类一起使用: 在这种情况下,我没有指定明确的日期模式,而是指定了符号格式。 我不确定在没有满足我需求的标准FormatStyle的情

  • 我需要使用格式“m-d-Y H:I:s.u”(包括毫秒)在laravel应用程序上以高精度的时间戳存储更新的_ 根据laravel文档,我可以通过在类上设置$dateFormat属性来自定义日期格式,但是。。。 主要问题是Laravel的模式生成器在数据库中添加了一列类型时间戳,当我使用$table- 有什么办法可以做到这一点吗?

  • 问题内容: 我在JSF页面中有这3个字段 我也有一个具有以下属性的后备豆: 我希望在将某些值插入字段val1和val2中而不刷新页面时,outputText元素自动更改其值。结果变量应以这种方式计算(它正在计算百分比):(val1 * val2)/ 100 您能帮我解决我的一些疑问吗?: 我知道为此,我需要javascript或AJAX之类的东西。您认为最好的方法是什么? 我很想知道我如何使用AJ

  • 点击Search by Name超链接时,URL会发生变化,但SearchByNameComponent会加载到app.component.html内容下面。如何在单击时只显示SearchbyNameComponent而不显示全部内容?target=_blank没有帮助。

  • 问题内容: 构建通知时,如何发出没有声音的通知?我正在构建通知,我的用户不喜欢它发出声音的事实。 如何将其更改为无声/无声? 我如何显示通知: 我尝试在Google上进行搜索,但我得到的唯一结果是如何播放声音,而不是不播放声音… 编辑 在某些人看来,它可能是重复的,但是在我的我无法找到指定默认值的替代方法,而此新方法称为setDefaults 问题答案: 删除的行。它不会播放声音,但是如果需要,您

  • 问题内容: 如何将当前时间显示为: 在Python中。谢谢。 问题答案: 首先是快速而肮脏的方法,其次是精确的方法(识别日光的节省与否)。