Django日期过滤器输出“上午”或“A.M.”

4 投票
3 回答
1837 浏览
提问于 2025-04-15 17:01

Django的日期模板过滤器使用字符"a"来表示“小写的上午”,而"A"则表示“大写的上午”。那么,怎么才能得到没有点的“小写”或者带点的“大写”呢?

你可以使用小写和大写的过滤器,但这样会影响到月份和星期几的格式显示。

3 个回答

0

最好的办法是写一个自定义的模板过滤器。

详细说明可以在这里找到。

1

你可以自己创建一个过滤器,这样你的模板就可以像这样:

{{ value|date:"D d M Y" }} {{ value|meridiem:"u" }}

其中 meridiem 可以是:

def meridiem(value, arg="ld"):
    if not value:
        return u''
    if 'u' in arg:
        if 'd' in arg:
            return 'A.M.'
        return 'AM'
    else:
        if 'd' in arg:
            return 'a.m.'
        return 'am'

这并不是特别优雅,但可能是一个简单的解决方案。请注意,我没有测试这段代码。

4

另外,你可以继承基本功能,然后简单地添加你想要的输出。(再次使用自定义过滤器)。

这里有一个自定义模板过滤器,它添加了一个新的参数'c',这个参数会改变(明白了吗,c... 改变)a/A的功能。它基本上就像一个开关,用来切换a/A的功能。这有点难以解释。下面是一些例子:

{{ datetime|smartdate:"h:i A" }} = '12:30 AM'
{{ datetime|smartdate:"h:i Ac" }} = '12:30 A.M.'
{{ datetime|smartdate:"h:i a" }} = '12:30 a.m.'
{{ datetime|smartdate:"h:i ac" }} = '12:30 am'

这是过滤器的代码...

import re
from django.template.defaultfilters import date as date_filter

# --------------------------------------------------------------------------------
#   |smartdate:"date format" -- new arg 'c' (change) alteras the AM/pm appearance
# --------------------------------------------------------------------------------
@register.filter
def smartdate(value, arg):
    rendered = date_filter(value, arg)
    if 'c' in arg:
        rendered = re.sub('(a|p)\.m\.c', lambda m: '%sm' % m.group(1), rendered)
        rendered = re.sub('(A|P)Mc', lambda m: '%s.M.' % m.group(1), rendered)
    return rendered

编辑 -- 对过滤器进行了稍微优化

撰写回答