Python格式化日期时间带有"st", "nd", "rd", "th"后缀(类似PHP的"S")
我想要一个Python的日期时间对象,能够像这样输出(并在Django中使用这个结果):
Thu the 2nd at 4:30
但是我发现Python没有办法像PHP的日期格式那样输出 st
、nd
、rd
或 th
,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 个回答
你可以通过使用一个叫做humanize的库来简单实现这个功能。
from django.contrib.humanize.templatetags.humanize import ordinal
然后你只需要把一个整数传给ordinal,比如说:
ordinal(2)
会返回 2nd
。
我不知道有没有内置的功能,但我用的是这个...
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')
django.utils.dateformat 里有一个叫 format
的函数,它需要两个参数。第一个参数是日期(可以是 datetime.date
或 datetime.datetime
的实例,datetime
是 Python 标准库里的一个模块),第二个参数是格式字符串。这个函数会返回一个格式化后的字符串。如果格式字符串里有大写的 S
,它会根据日期中的天数,自动变成 'st'、'nd'、'rd' 或 'th' 中的一个,具体取决于这个日期是几号。