Python格式化日期时间带有"st", "nd", "rd", "th"后缀(类似PHP的"S")

33 投票
8 回答
34218 浏览
提问于 2025-04-16 03:43

我想要一个Python的日期时间对象,能够像这样输出(并在Django中使用这个结果):

Thu the 2nd at 4:30

但是我发现Python没有办法像PHP的日期格式那样输出 stndrdth,PHP使用的是 S 字符串(他们称之为“英语序数后缀”)(http://uk.php.net/manual/en/function.date.php)。

在Django/Python中有没有内置的方法可以做到这一点? strftime 这个方法不够好 (http://docs.python.org/library/datetime.html#strftime-strptime-behavior)。

Django有一个过滤器可以实现我想要的效果,但我想要一个函数,而不是过滤器,来完成这个需求。无论是Django的还是Python的函数都可以。

8 个回答

14

你可以通过使用一个叫做humanize的库来简单实现这个功能。

from django.contrib.humanize.templatetags.humanize import ordinal

然后你只需要把一个整数传给ordinal,比如说:

ordinal(2) 会返回 2nd

28

我不知道有没有内置的功能,但我用的是这个...

def ordinal(n):
    return str(n)+("th" if 4<=n%100<=20 else {1:"st",2:"nd",3:"rd"}.get(n%10, "th"))

还有:

def dtStylish(dt,f):
    return dt.strftime(f).replace("{th}", ordinal(dt.day))

可以这样调用dtStylish来得到 星期四,2号,下午4:30。在你想放入日期的地方用 {th},这里的“%d”是一个python格式代码

dtStylish(datetime(2019, 5, 2, 16, 30), '%a the {th} at %I:%M')
36

django.utils.dateformat 里有一个叫 format 的函数,它需要两个参数。第一个参数是日期(可以是 datetime.datedatetime.datetime 的实例,datetime 是 Python 标准库里的一个模块),第二个参数是格式字符串。这个函数会返回一个格式化后的字符串。如果格式字符串里有大写的 S,它会根据日期中的天数,自动变成 'st'、'nd'、'rd' 或 'th' 中的一个,具体取决于这个日期是几号。

撰写回答