33 Stimmen

python formatiert datetime mit "st", "nd", "rd", "th" (englisches Ordnungssuffix) wie PHPs "S"

Ich möchte ein Python datetime-Objekt auszugeben (und verwenden Sie das Ergebnis in Django) wie folgt:

Thu the 2nd at 4:30

Aber ich finde keinen Weg in Python, um auszugeben st , nd , rd , oder th wie ich es mit dem PHP-Datetime-Format mit dem S string (Englisches Ordnungssuffix") ( http://uk.php.net/manual/en/function.date.php ).

Gibt es eine integrierte Möglichkeit, dies in Django/Python zu tun? strftime nicht gut genug ist ( http://docs.python.org/library/datetime.html#strftime-strptime-behavior ).

Django hat einen Filter, der tut, was ich will, aber ich will eine Funktion, nicht einen Filter, um zu tun, was ich will. Entweder ein Django oder Python-Funktion wird in Ordnung sein.

36voto

Alex Martelli Punkte 805329

El django.utils.dateformat hat eine Funktion format die zwei Argumente benötigt, wobei das erste das Datum ist (a datetime.date [[oder datetime.datetime Instanz]], wobei datetime ist das Modul in der Python-Standardbibliothek), das zweite ist die Formatzeichenkette, und gibt die resultierende formatierte Zeichenkette zurück. Der Großbuchstaben- S (natürlich nur, wenn es Teil der Formatzeichenkette ist) ist diejenige, die sich je nach dem Monatstag des betreffenden Datums zum richtigen "st", "nd", "rd" oder "th" erweitert.

28voto

Frosty Snowman Punkte 325

Ich weiß nicht, ob es eingebaut ist, aber ich habe dies benutzt...

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

und:

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

dtStylish kann wie folgt aufgerufen werden, um Folgendes zu erhalten Thu the 2nd at 4:30 . Verwenden Sie {th} wo Sie den Tag des Monats eintragen wollen ("%d") python format code )

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

14voto

Adrian Krige Punkte 91

Sie können dies ganz einfach mit Hilfe der humanize-Bibliothek tun

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

Sie können dann einfach ordinal eine beliebige ganze Zahl angeben, d.h.

ordinal(2) wird zurückgegeben 2nd

11voto

Edster Punkte 85

Ich habe gerade eine kleine Funktion geschrieben, um das gleiche Problem in meinem eigenen Code zu lösen:

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]

-2voto

eegloo Punkte 155

Folgende Lösung habe ich für das obige Problem gefunden:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X