【问题标题】:python format datetime with "st", "nd", "rd", "th" (english ordinal suffix) like PHP's "S"python 格式日期时间,带有“st”、“nd”、“rd”、“th”(英文序号后缀),如 PHP 的“S”
【发布时间】:2011-04-08 08:22:15
【问题描述】:

我想要一个 python 日期时间对象来输出(并在 django 中使用结果),如下所示:

Thu the 2nd at 4:30

但我无法在 python 中输出 stndrdth,就像我可以使用带有 S 字符串的 PHP 日期时间格式(他们称之为“英文序数后缀” ) (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 函数都可以。

【问题讨论】:

标签: php python django datetime format


【解决方案1】:

django.utils.dateformat 有一个函数 format,它接受两个参数,第一个是日期(datetime.date [[或datetime.datetime]] 实例,其中datetime 是 Python 标准库中的模块),第二个是格式字符串,并返回生成的格式化字符串。大写的-S 格式项(当然,如果是格式字符串的一部分)是根据日期扩展为“st”、“nd”、“rd”或“th”中正确之一的格式项——相关日期的月份。

【讨论】:

  • 这可以使用更多细节。例如,您可以使用 DateFormat(max_date).format("jS M, Y") 将 max_date 格式化为“2019 年 5 月 1 日”
【解决方案2】:

不知道内置,但我用过这个...

def ord(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}", ord(dt.day))

dtStylish 可以如下调用得到Thu the 2nd at 4:30。使用{th} 来放置月份中的某天(“%d”python format code

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

【讨论】:

  • @Arijoon 这部分涵盖了“青少年”,他们不遵循与其他一切相同的规则。如果你删除它,你会得到11st13rd,而它们应该是11th13th
【解决方案3】:

你可以简单地使用人性化库来做到这一点

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

然后你可以给序数任何整数,即

ordinal(2) 将返回 2nd

【讨论】:

    【解决方案4】:

    我刚刚编写了一个小函数来解决我自己的代码中的相同问题:

    def foo(myDate):
        date_suffix = ["th", "st", "nd", "rd"]
    
        if myDate % 10 in [1, 2, 3] and myDate not in [11, 12, 13]:
            return date_suffix[myDate % 10]
        else:
            return date_suffix[0]
    

    【讨论】:

      【解决方案5】:

      我对上述问题的解决方案如下:

      datetime.strptime(mydate, '%dnd %B %Y')
      datetime.strptime(mydate, '%dst %B %Y')
      datetime.strptime(mydate, '%dth %B %Y')
      datetime.strptime(mydate, '%drd %B %Y')
      

      【讨论】:

      • 我正在寻找一种方法来获取日期时间对象并将其转换为包含序数的字符串。这个答案是相反的。
      猜你喜欢
      • 2017-01-07
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 2012-11-17
      相关资源
      最近更新 更多